2011-07-06 6 views
6

J'ai un script appelé jobrunner.py qui appelle les méthodes de classe dans main.py. Voir ci-dessous ...Python Multiprocess diff entre Windows et 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() 

processus _A et _b sont invoquées sans aucun problème sur Mac OS X et Ubuntu, mais lorsque je tente d'exécuter la même chose sous Windows (même version de python et tout), il ne parvient en disant que l'indice est hors de portée. Cela m'amène à croire que la variable "globale" BBOX n'est pas définie ou transmise entre les modules sur la plate-forme Windows. Est-ce que quelqu'un d'autre a vu quelque chose comme ça et sait comment le réparer?

Adam

MISE À JOUR: I figured it out, même si elle est peut-être un hack total de ... Voir ci-dessous!

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

Répondre

12

Vous ne devriez pas attendre les valeurs des variables globales définies dans le processus parent pour se propager automatiquement aux processus enfants.

Votre code fonctionne sur les plates-formes Unix, car sur ces plates-formes, multiprocessing utilise fork(). Cela signifie que chaque processus enfant reçoit une copie de l'espace adresse du processus parent, y compris toutes les variables globales.

Ce n'est pas le cas sous Windows; toutes les variables du processus parent auxquelles l'enfant doit avoir accès doivent être explicitement passed down or placed in shared memory. Une fois que vous faites cela, votre code fonctionnera à la fois sur Unix et sur Windows.

+0

Merci, c'est vraiment aller dans la bonne direction, cependant, j'ai besoin de passer une liste dans la mémoire partagée. Dans ce cas, ce sera quelque chose comme cette liste: [['57', '78', '23', '40']] que je définis comme BBOX. Il n'y a pas de c_type pour une liste est là? – aeupinhere