![](/img/trans.png)
[英]multiprocessing.Pool: When to use apply, apply_async or map?
[英]Is there a way for workers in multiprocessing.Pool's apply_async to catch errors and continue?
當使用multiprocessing.Pool的apply_async()
,代碼中斷會發生什么? 我認為這包括異常,但可能還有其他因素導致工作者功能失敗。
import multiprocessing as mp
pool = mp.Pool(mp.cpu_count())
for f in files:
pool.apply_async(workerfunct, args=(*args), callback=callbackfunct)
正如我現在所理解的那樣,進程/工作程序失敗(所有其他進程都繼續)並且沒有執行拋出錯誤的任何事情,即使我用try / except捕獲錯誤也是如此。
作為一個例子,通常我除了錯誤並輸入默認值和/或打印出錯誤消息,然后代碼繼續。 如果我的回調函數涉及寫入文件,則使用默認值完成。
我懷疑你沒有看到你的示例代碼發生任何事情的原因是因為所有的工作者函數調用都失敗了。 如果worker函數失敗,則永遠不會執行回調。 除非您嘗試從apply_async調用返回的AsyncResult對象中獲取結果,否則根本不會報告失敗。 但是,由於您沒有保存任何這些對象,因此您永遠不會知道發生的故障。 如果我是你,我會在你測試時嘗試使用pool.apply,這樣你就會在發生錯誤時立即看到錯誤。
如果您使用的是Python 3.2+,則可以使用error_callback
關鍵字參數來處理在worker中引發的異常。
pool.apply_async(workerfunct, args=(*args), callback=callbackfunct, error_callback=handle_error)
將使用異常對象作為參數調用handle_error
。
如果不是,則必須在try
/ except
包裝所有工作函數,以確保執行callback
。 (我認為你的印象是,在其他問題上我的回答不起作用,但事實並非如此。抱歉!):
def workerfunct(*args):
try:
# Stuff
except Exception as e:
# Do something here, maybe return e?
pool.apply_async(workerfunct, args=(*args), callback=callbackfunct)
如果您不想/不想更改實際要調用的函數,也可以使用包裝函數:
def wrapper(func, *args):
try:
return func(*args)
except Exception as e:
return e
pool.apply_async(wrapper, args=(workerfunct, *args), callback=callbackfunct)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.