2014-02-28 78 views
8

我正在使用Python(2.7.3)中的多處理模塊,並且想要調試我的工作人員正在進行的某些操作。但是,我似乎無法捕捉到工作線程中的任何異常。如何在多處理中捕捉工作中的異常

小例子:

import multiprocessing as mp 


a=[1] 
def worker(): 
    print a[2] 


def pool(): 
    pool = mp.Pool(processes=1) 
    pool.apply_async(worker, args =()) 
    pool.close() 
    pool.join() 
    print "Multiprocessing done!" 


if __name__ == '__main__': 
    pool() 

預計這將引發一個IndexError,但我的輸出僅

Multiprocessing done! 

有沒有一種方法,以顯示我的工作線程存在的無所有異常手動提高我自己的?

回答

18

該錯誤是沒有提出,除非你叫AsyncResultget method(在apply_async的返回值):

按照AsyncResult.get documentation

返回結果當它到達。如果超時不是無,並且 結果未在超時秒內到達,則會引發 multiprocessing.TimeoutError。 如果遠程調用異常發生 異常,那麼該異常將通過get()進行重新調整。

def pool(): 
    pool = mp.Pool(processes=1) 
    result = pool.apply_async(worker, args=()) 
    result.get() # <------------ 
    pool.close() 
    pool.join() 
    print "Multiprocessing done!" 
+0

哇,這很快。謝謝。 – Dschoni

+0

對不起,我猜那是我意外。我經常回到這個答案......但是我的downvote不能被取消2個小時。抱歉。 – Dschoni

2

我想falsetru給你所需要的。我只想擴大一點。

如果您不僅要獲取錯誤而且要獲取原始上下文(即瞭解worker()的第1行發生異常),那麼您可以檢查this nice post by Ned Batchelder,其中解釋瞭如何使用原始上下文重新調用異常。

這對mp.Pool不起作用,所以它只是爲了防止你需要更多的東西。 This SO Question使用更明確的多處理技術而不是mp.Pool覆蓋了您的問題。