2012-05-30 7 views
5

Ho un po 'di codice Python che assomiglia a questo:eccezione Finding in python multiprocessing

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) 

Funziona benissimo quando ho impostato il flag serial, ma dà il seguente errore quando si utilizza il Pool. Quando provo a stampare qualcosa da do_experiment non compare nulla, quindi non posso provare/catturare lì e stampare una traccia dello stack.

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 

Qual è un buon modo per eseguire il debug di questo?

+0

Questo probabilmente non ha importanza, ma qual è il valore restituito da 'cpu_count()'? – mgilson

+0

Dipende dal sistema 2 sul mio portatile 8 sul server. In entrambi i casi, se 'pool.map' viene utilizzato al posto di di 'map', le cose si rompono – noio

risposta

13

Sono tornato nella mia storia git fino a quando ho trovato un commit in cui le cose stavano ancora funzionando.

ho aggiunto una classe per il mio codice che si estende dict in modo che le chiavi si può accedere con un . (così dict.foo al posto di dict["foo"]. Multiprocessing non ha preso gentilmente a questo, utilizzando un dict ordinaria ha risolto il problema.

+1

Come nota, in realtà non devi farlo in questo modo: usa una classe normale e poi fai 'self .__ dict __. update ()' – Voo

+1

Wow , per coincidenza, aggiungo lo stesso sor t di classe è ciò che ha rotto anche il mio multiprocessing .. – Ryan

+0

Questo suona più inaspettato. Qualche idea su quale potrebbe essere la causa principale di questo bug? È un bug nell'interprete Python? –