タイムアウトを設定してJoblibで並列処理を実行

pythonで並列処理をするときにはjoblibが手軽で便利だが、タイムアウト時の処理に自由度がない。 というのも、joblib.Parallelの引数にtimeoutを設定すると、指定した時間を超えたときに例外を投げて計算全体を止めてくれるが、タイムアウトした処理を無視して計算を継続するようなことはしてくれない。

joblib.readthedocs.io

pythonで自作関数にタイムアウトを設定するパッケージだとtimeout-decoratorが有名だが、multithreadingにも対応しているようだ。 なのでjoblib.Parallelのbackendをthreadingにすれば並列処理でtimeout-decoratorを使うことができる。

github.com

joblib.Parallelのbackendをデフォルトからmultithreading にすると(GILのせいで)計算時間が伸びることが多いけど、タイムアウトの処理ができずに永遠に計算が終わらないよりはマシだということにしておこう。 gist.github.com