2011-07-06 23 views
6

Tengo un script llamado jobrunner.py que llama a los métodos de clase en main.py. Véase más abajo ...Python Multiproceso diff entre Windows y 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() 

Procesos _a y _b se invocan sin ningún tipo de problemas en OS X y Ubuntu, pero cuando trato de ejecutar el mismo que en Windows (misma versión de Python y todo), se produce un error diciendo que el índice está fuera de rango. Esto me lleva a creer que la variable "global" BBOX no se está configurando o transmitiendo entre módulos en la plataforma de Windows. ¿Alguien más ha visto algo como esto y sabe cómo solucionarlo?

Adam

ACTUALIZACIÓN: lo he descubierto a pesar de que podría ser un corte total de ... Ver más adelante!

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

Respuesta

12

No se debe esperar que los valores de las variables globales que se configuran en el proceso principal que se propagan automáticamente a los procesos hijos.

Su código funciona en plataformas de tipo Unix porque en esas plataformas multiprocessing usa . 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; cada variable del proceso principal al que debe acceder el niño tiene que ser explícitamente passed down or placed in shared memory.

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

+0

Gracias eso realmente me está llevando en la dirección correcta, sin embargo, tengo que pasar una lista a la memoria compartida. En este caso, será algo así como esta lista: [['57', '78', '23', '40']] que estoy configurando como BBOX. No hay ningún tipo_de_c para una lista hay? – aeupinhere

Cuestiones relacionadas