2012-05-30 15 views
5

Mam bitowego kodu Pythona, który wygląda tak:Znalezienie wyjątek w Pythonie 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) 

działa poprawnie kiedy ustawić flagę serial, ale daje następujący błąd, gdy używany jest Pool. Kiedy próbuję drukować coś od do_experiment nic się nie pokazuje, więc nie mogę spróbować/złapać tam i wydrukować ślad stosu.

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 

Co to dobry sposób, aby przejść debugowania to?

+0

Prawdopodobnie to nie ma znaczenia, ale jaka jest wartość zwracana przez 'cpu_count()'? – mgilson

+0

Zależy od systemu.2 na moim własnym laptopie 8. Na każdym z nich, czy 'pool.map' jest używany zamiast 'map', rzeczy się zrywają – noio

Odpowiedz

13

Wróciłem do mojej historii git, aż znalazłem commit, w którym rzeczy wciąż działały.

dodałem klasę do mojego kodu, który rozciąga dict tak, że klucze mogą być dostępne z . (tak dict.foo w zastępstwie dict["foo"]. Wieloprocesorowe nie odnoszą się pozytywnie do tego, stosując zwykły DICT rozwiązało problem.

+1

Na marginesie, naprawdę nie musisz tego robić w ten sposób. Użyj zwykłej klasy, a następnie wykonaj' self .__ dict __. update () ' – Voo

+1

Wow , przypadkowo dodałem tego samego sor'a t klasy jest również tym, co złamało moje przetwarzanie wielorakie. – Ryan

+0

To brzmi najbardziej nieoczekiwanie. Czy wiesz, jaka może być przyczyna tego błędu? Czy jest to błąd w tłumaczu Pythona? –

Powiązane problemy