2014-10-08 38 views
0

我有一個Python進程池使用from multiprocessing import Pool。我將這些進程傳遞給不同的函數來運行,調用Pool.apply_async函數。如果我在其中一個函數中引入錯誤(即:一行代碼,如5/0),預期的命令行報告ZeroDivisionError: integer division or modulo by zero將永遠不會顯示,程序也不會終止。即使我在調用Pool.apply_async時引入了回調函數,如果進程必須執行的函數有錯誤,回調函數也不會被調用。多進程中的進程。池不報告運行時錯誤

如何讓池中的進程報告錯誤,並在出現錯誤時終止進程?

回答

3

你有實際嘗試getapply_async(或map_async)返回的AsyncResult結果爲異常父待提高。您提供

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關鍵字參數,它允許您傳遞一個回調,如果worker中出現異常,則會執行回調,但在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 
+0

非常適合您的信息。非常感謝!我想我會轉向Python 3.2以簡化操作。 – 2014-10-08 16:33:59

+0

@ASDF如果可能的話,我會推薦到3.4(更新),但是,Python 3.x會讓你的生活更輕鬆。如果沒有太多的工作來移植你的程序,那就去做吧。 – dano 2014-10-08 16:37:10