0

を使用してPythonでプロセスのプールを持っていますfrom multiprocessing import Pool。これらのプロセスに、実行するさまざまな関数を渡し、Pool.apply_async関数を呼び出します。これらの関数の 1 つ (例: のようなコード行5/0) にエラーを導入すると、予想されるコマンド ライン レポートZeroDivisionError: integer division or modulo by zeroが表示されず、プログラムが終了しません。への呼び出しにコールバック関数を導入してPool.apply_asyncも、プロセスが実行する必要がある関数にエラーがある場合、コールバック関数は呼び出されません。

プール内のこれらのプロセスでエラーを報告し、問題が発生した場合に終了するにはどうすればよいですか?

4

1 に答える 1

3

親で例外が発生するようにするには、返された by (または)getからの結果を実際に試行する必要があります。AsyncResultapply_asyncmap_async

def func():
    raise Exception("We failed")

...
result = pool.apply_async(func, args=(arg))
time.sleep(2)
result.get() # Exception only gets raised here

指定したものは、関数が正常に返さcallbackれた場合にのみ実行されます。例外が発生した場合はスキップされます。

Python 3.2+ では、error_callbackキーワード引数が導入されました。これにより、ワーカーで例外が発生した場合に実行されるコールバックを渡すことができますが、Python 2.x ではそれを行うことができません。できることは、ワーカーで発生した例外を返すのではなく、ワーカー関数をtry/exceptブロックでラップすることです。

def func():
    try:
        raise Exception("We failed")
    except Exception as e:
        return e

Exception次に、が返されたかどうかを確認する通常のコールバック関数を使用できます。

def callback(result):
   if isinstance(result, Exception):
       # Do whatever you need to do to clean up and exit
   else:
       # Function was successful
于 2014-10-08T16:30:19.050 に答える