Python Multiprocess diff entre Windows y Linux

Tengo un script llamado jobrunner.py que llama a los métodos de clase en main.py. Vea abajo…

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

Los procesos _a y _b se invocan sin ningún problema en OSX y Ubuntu, pero cuando bash ejecutar lo mismo en Windows (la misma versión de python y todo), falla diciendo que el índice está fuera de rango. Esto me lleva a creer que la variable “global” BBOX no se está configurando o pasando entre los módulos en la plataforma Windows. ¿Alguien más ha visto algo como esto y sabe cómo solucionarlo?

Adán

ACTUALIZACIÓN: Lo descubrí a pesar de que podría ser un hack total … ¡Vea a continuación!

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

No debe esperar que los valores de las variables globales que establezca en el proceso principal se propaguen automáticamente a los procesos secundarios.

Su código funciona en plataformas similares a Unix porque en esas plataformas el multiprocessing usa fork() . Esto significa que cada proceso secundario obtiene una copia del espacio de direcciones del proceso principal, incluidas todas las variables globales.

Este no es el caso en Windows; Todas las variables del proceso principal a las que el niño debe acceder deben pasar de forma explícita o ubicarse en la memoria compartida .

Una vez que haga esto, su código funcionará tanto en Unix como en Windows.