2011-07-06 19 views
6

Mam skrypt o nazwie jobrunner.py, który wywołuje metody klasy w pliku main.py. Zobacz poniżej ...Python Multiprocess diff między Windows i 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() 

Procesy _a i _B są wywoływane bez żadnych problemów na OSX i Ubuntu, ale gdy próbuję uruchomić to samo na Windows (tę samą wersję Python i wszystkich), to nie mówią, że indeks jest poza zakresem. To prowadzi mnie do przekonania, że ​​"globalna" zmienna BBOX nie jest ustawiana lub przekazywana między modułami na platformie Windows. Czy ktoś jeszcze widział coś takiego i wiedział, jak to naprawić?

Adam

UPDATE: I zorientowaliśmy się, mimo to może być całkowity siekać ... Zobacz poniżej!

# 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() 

Odpowiedz

12

Nie należy oczekiwać wartości zmiennych globalnych, które można wybierać w procesie macierzystym być automatycznie propagowane do procesów potomnych.

Twój kod działa na platformach uniksowych, ponieważ na tych platformach multiprocessing używa fork(). Oznacza to, że każdy proces potomny otrzymuje kopię przestrzeni adresowej procesu nadrzędnego, w tym wszystkie zmienne globalne.

Nie dotyczy to systemu Windows; każda zmienna z procesu nadrzędnego, do której ma dostęp dziecko, musi być jawnie passed down or placed in shared memory.

Po wykonaniu tej czynności twój kod będzie działał zarówno na systemach Unix, jak i Windows.

+0

Dzięki, że to naprawdę doprowadza mnie do właściwego kierunku, jednak muszę przekazać listę do pamięci współdzielonej. W tym przypadku będzie to coś takiego jak ta lista: [['57', '78', '23', '40']], które ustawiam jako BBOX. Nie ma c_type dla listy? – aeupinhere

Powiązane problemy