multiprocessing モジュールを介して実行される関数内で例外が発生した場合に、スタック トレースを取得する最良の方法について疑問に思っています。次に例を示します。
import multiprocessing
def square(x):
raise Exception("Crash.")
return x**2
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=4)
results = pool.map_async(square, range(5))
for result in results.get():
print result
これは以下を出力します:
Traceback (most recent call last):
File "/extra/workspace/Playground/src/multiproc/multiproc_debug.py", line 11, in <module>
for result in results.get():
File "/extra/Python 2.6/lib/python2.6/multiprocessing/pool.py", line 422, in get
raise self._value
Exception: Crash.
そのため、有用なスタック トレースがなく、非常に面倒です。これに対する私の現在の解決策:
import multiprocessing
import traceback
def square(x):
try:
# some more code...
raise Exception("Crash.")
except Exception, exception:
print exception
traceback.print_exc()
raise
return x**2
すべての定型コードなしでこの動作を取得する方法はありますか? そうでない場合、この機能を含めない理由は何ですか?
編集:定型コードにデコレータを使用できますが、そのようなデコレータが標準ライブラリに含まれているかどうかはわかりませんか?