複数のファイルで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'>, ())
これらの1つでも表示された場合、プロセスの親プロセスは永久にハングし、子を刈り取って終了することはありません。