日々精進

新しく学んだことを書き留めていきます

multiprocessing.Poolで並列処理をすると、子プロセスで例外が発生した場合エラーメッセージがでない

multiprocessing.Poolでも、apply_asyncを使って子プロセスを起動している場合は子プロセスで発生した例外を親プロセスに伝えられる。詳細は以下参照。

conta.hatenablog.com

自分はmapを使っていたので同様のことができず困った。しかも、子プロセスで例外が発生した場合、子プロセスの処理が止まり、親プロセスに制御が戻ってこなくなる・ログにも何も出ないという状態になって原因が分からず苦労した。。

concurrent.futures.ProcessPoolExecutorを使えばmultiprocessing.Pool.mapと同様の使い方ができ、子プロセスで発生した例外を親プロセスに伝えてくれるのでこれを使うことで解決した。詳細は以下参照。

stackoverflow.com

ただし、out of memoryが発生した場合はBrokenProcessPoolという例外が発生するので原因が分かりにくい。。他にもいくつかの原因でBrokenProcessPoolが発生するらしい。詳細は以下参照。

stackoverflow.com