Próbuję uruchomić trochę kodu Pythona na kilka plików równolegle. Konstrukt jest zasadniczo:Pula wieloprocesorowa Pythona zawiesza się przy łączeniu?
def process_file(filename, foo, bar, baz=biz):
# do stuff that may fail and cause exception
if __name__ == '__main__':
# setup code setting parameters foo, bar, and biz
psize = multiprocessing.cpu_count()*2
pool = multiprocessing.Pool(processes=psize)
map(lambda x: pool.apply_async(process_file, (x, foo, bar), dict(baz=biz)), sys.argv[1:])
pool.close()
pool.join()
ja wcześniej używany pool.map zrobić coś podobnego i to działało świetnie, ale nie wydaje się, że tu użyć, ponieważ pool.map nie (wydaje się) pozwól mi przekazać dodatkowe argumenty (i użycie lambda to nie zadziała, ponieważ lambda nie może zostać zmobilizowana).
Tak więc teraz próbuję uruchomić rzeczy za pomocą funkcji apply_async() bezpośrednio. Mój problem polega na tym, że kod wydaje się zawieszać i nigdy się nie kończy. Kilka plików kończy się niepowodzeniem z wyjątkiem, ale nie rozumiem, dlaczego to, co spowodowałoby niepowodzenie/zawieszenie połączenia? Co ciekawe, jeśli żaden z plików nie zakończy się niepowodzeniem z wyjątkiem, to program kończy działanie w sposób czysty.
Czego mi brakuje?
Edit: Gdy funkcja (a zatem pracownik) nie widzę ten wyjątek:
Exception in thread Thread-3:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 505, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 376, in _handle_results
task = get()
TypeError: ('__init__() takes at least 3 arguments (1 given)', <class 'subprocess.CalledProcessError'>,())
Jeśli widzę nawet jeden z nich, proces nadrzędny proces zawiesza się zawsze, nigdy czerpania dzieci i wysiadanie .
Twój kod wydaje się działać dobrze, nawet jeśli wrzucam losowe wyjątki do 'process_file'. Być może ma to związek z tym, co robisz w 'process_file', który powoduje problemy. – robertklep
Huh. jaka wersja pythona? Mam 2,7. Plik process_file w prawdziwym programie jest dość skomplikowany, wykorzystując w dużym stopniu biblioteki PIL, NetworkX, poly2tri i inne. Znam co najmniej 2 miejsca, w których poznałem błędy, które mogą powodować wyjątki w niektórych przypadkach, ale muszę po prostu zignorować te błędy i przejść dalej. Zastanawiam się, dlaczego to nigdy nie wyjdzie dla mnie, ale pracuję dla ciebie. – clemej
2.7.2, to jest to, co testowałem z: https://gist.github.com/robertklep/5125319 – robertklep