2011-07-06 40 views
6

Tôi có một tập lệnh gọi là jobrunner.py gọi các phương thức lớp trong main.py. Xem dưới đây ...Sự khác biệt đa xử lý Python giữa Windows và Linux

# jobrunner.py 
from multiprocessing import Process 
import main 
from main import BBOX 

def _a(arg): 
    f = main.a() 
    print f.run() 

def _b(arg): 
    p = main.b() 
    print p.run() 

if __name__ == '__main__': 
    world = '-180,180,-90,90' 
    BBOX.append(world.split(',')) 

    p1 = Process(target=_a, args=("1",)) 
    p2 = Process(target=_b, args=("1",)) 

    p1.start() 
    p2.start() 

    p1.join() 
    p2.join() 

Processes _a và _b được gọi mà không cần bất kỳ vấn đề trên OSX và Ubuntu nhưng khi tôi cố gắng chạy điều tương tự trên Windows (tương tự phiên bản của python và tất cả), nó vẫn thất bại nói chỉ số nằm ngoài phạm vi. Điều này khiến tôi tin rằng BBOX "toàn cầu" không được thiết lập hoặc chuyển giữa các mô-đun trên nền tảng Windows. Có ai khác nhìn thấy một cái gì đó như thế này và biết làm thế nào để sửa chữa nó?

Adam

UPDATE: I figured it out mặc dù nó có thể là một tổng Hack ... Xem dưới đây!

# jobrunner.py 
from multiprocessing import Process 
import main 
from main import BBOX 

def _a(arg): 
    BBOX.append(arg) #This is the key 
    f = main.a() 
    print f.run() 

def _b(arg): 
    BBOX.append(arg) #This is the key 
    p = main.b() 
    print p.run() 

if __name__ == '__main__': 
    world = '-180,180,-90,90' 
    BBOX.append(world.split(',')) 

    p1 = Process(target=_a, args=(BBOX[0],)) 
    p2 = Process(target=_b, args=(BBOX[0],)) 

    p1.start() 
    p2.start() 

    p1.join() 
    p2.join() 

Trả lời

12

Bạn không nên mong đợi giá trị của các biến toàn cục mà bạn đặt trong quy trình gốc sẽ được tự động truyền cho quy trình con.

Mã của bạn xảy ra để hoạt động trên nền tảng giống Unix vì trên các nền tảng đó multiprocessing sử dụng fork(). Điều này có nghĩa là mọi tiến trình con đều nhận được một bản sao không gian địa chỉ của tiến trình cha mẹ, bao gồm tất cả các biến toàn cầu.

Đây không phải là trường hợp trên Windows; mọi biến từ quá trình cha mẹ cần phải được truy cập bởi đứa trẻ phải rõ ràng là passed down or placed in shared memory.

Khi bạn làm điều này, mã của bạn sẽ hoạt động trên cả Unix và Windows.

+0

Cảm ơn điều đó thực sự giúp tôi đi đúng hướng, tuy nhiên, tôi cần phải chuyển danh sách vào bộ nhớ dùng chung. Trong trường hợp này, nó sẽ giống như danh sách này: [['57', '78', '23', '40']] mà tôi đang thiết lập là BBOX. Không có c_type cho một danh sách là có? – aeupinhere

Các vấn đề liên quan