私はいくつかのPythonコードをいくつかのファイルに対して並列に実行しようとしています。構築物は、基本的には次のとおりです。ジョインでPythonマルチプロセッシングプールがハングアップしますか?
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()
pool.mapは(ように見える)しませんので、私は以前に似た何かをするpool.mapを使用しました、それは素晴らしい仕事が、私はここにいることを使用するように見えることはできません余分な引数を渡すことができます(ラムダをマーシャリングできないため、ラムダを使用すると機能しません)。
これで、apply_async()を直接使用して動作させようとしています。私の問題は、コードがハングアップして終了しないようです。いくつかのファイルが例外で失敗しますが、どうして失敗/ハングを引き起こす原因になっていないのでしょうか?興味深いことに、ファイルに例外が発生しても失敗しない場合、正常に終了します。
私には何が欠けていますか?
編集:決して子供を享受していないと出て行く、永遠
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'>,())
私はこれらの一つでも表示される場合は、プロセスの親プロセスがハングアップします。function(ひいては労働者)が失敗したとき、私はこの例外を参照してください。
あなたのコードは、 'process_file'にランダム例外をスローしたとしてもうまくいくようです。だからおそらく、問題を引き起こしている 'process_file'であなたが実際にやっていることと関係しているでしょう。 – robertklep
Huh。どのバージョンのpython?私は2.7です。実際のプログラムのprocess_fileは非常に複雑で、PIL、NetworkX、poly2triなどのライブラリを大量に使用しています。私はいくつかのケースで例外を引き起こす可能性があるバグを知っている少なくとも2か所は知っていますが、私は単にそれらのエラーを無視して移動する必要があります。私はなぜそれが私のために出くわすことはありませんが、あなたのために働くように困惑しています。 – clemej
2.7.2、これは私がテストしたものです:https://gist.github.com/robertklep/5125319 – robertklep