2012-05-30 8 views
5

tengo un poco de código Python que tiene este aspecto:excepción hallado en pitón multiprocesamiento

procs = cpu_count()-1 
if serial or procs == 1: 
    results = map(do_experiment, experiments) 
else: 
    pool = Pool(processes=procs)  
    results = pool.map(do_experiment, experiments) 

Funciona muy bien cuando me puse la bandera serial, pero da el siguiente error cuando se utiliza el Pool. Cuando intento imprimir algo desde do_experiment, no aparece nada, así que no puedo intentar capturarlo e imprimir un seguimiento de la pila.

Exception in thread Thread-2: 
Traceback (most recent call last): 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 530, in __bootstrap_inner 
    self.run() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 483, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 285, in _handle_tasks 
    put(task) 
TypeError: 'NoneType' object is not callable 

¿Cuál es una buena manera de proceder a la depuración de esto?

+0

Probablemente esto no importe, pero ¿cuál es el valor de retorno de 'cpu_count()'? – mgilson

+0

Depende del sistema. 2 en mi computadora portátil. 8 en el servidor. De cualquier manera, si 'pool.map' se usa en lugar de 'map', las cosas se rompen. – noio

Respuesta

13

Volví a mi historial de git hasta que encontré un compromiso donde las cosas seguían funcionando.

he añadido una clase de mi código que se extiende dict de manera que las teclas se puede acceder con un . (por lo dict.foo en lugar de dict["foo"]. Multiprocesamiento no con buenos ojos a esto, el uso de un dict ordinaria resolvió el problema.

+1

Como nota, realmente no tienes que hacerlo de esta manera. Usa una clase normal y luego haz' self .__ dict __. update () ' – Voo

+1

Wow , casualmente yo agregando exactamente el mismo sor t de clase es lo que también rompió mi multiprocesamiento. – Ryan

+0

Esto suena muy inesperado. ¿Alguna idea de cuál podría ser la causa raíz de este error? ¿Es un error en el intérprete de Python? –

Cuestiones relacionadas