2015-02-24 116 views
1

我設置了一些簡單的代碼來測試多處理的一些問題處理,並且我無法跟蹤此代碼中的錯誤,因爲沒有來自進程的反饋。我怎麼能從子流程中接收異常,因爲現在我對它不知情。如何調試此代碼。爲什麼Python中沒有報告多處理的錯誤,以及如何打開報告錯誤?

# coding=utf-8 
import multiprocessing 
import multiprocessing.managers 
import logging 

def callback(result): 
    print multiprocessing.current_process().name, 'callback', result 

def worker(io_lock, value): 
    # error 
    raise RuntimeError() 
    result = value + 1 
    with io_lock: 
    print multiprocessing.current_process().name, value, result 
    return result 

def main(): 
    manager = multiprocessing.Manager() 
    io_lock = manager.Lock() 
    pool = multiprocessing.Pool(multiprocessing.cpu_count()) 
    for i in range(10): 
    print pool.apply_async(worker, args=(io_lock, i), callback = callback) 
    pool.close() 
    pool.join() 

if __name__ == '__main__': 
    logging.basicConfig(level = logging.DEBUG) 
    main() 

回答

2

您可以嘗試,捕獲和記錄工作進程內發生的異常。像這樣的東西

def worker(io_lock, value): 
    try: 
     raise RuntimeError('URGH') # Or do your actual work here 
    except: 
     logging.exception('Exception occurred: ') 
     raise # Re-raise the exception so that the process exits 

異常日誌處理程序將自動包含堆棧跟蹤。

+0

看起來簡單的解決方案是最好的解決方案。我正在測試它如何與16個進程協同工作。 – Chameleon 2015-02-24 21:40:19

+0

我已經稍微修改了我的答案,您應該在記錄它之後重新提出異常。這樣的過程將會崩潰並正常退出。當然你可能不需要這種行爲。但我會建議。 – aychedee 2015-02-25 10:56:56

+0

這是真的異常應該在記錄後再次提出,因爲沒有處理 - 你是對的,這是最好的模式。 – Chameleon 2015-02-25 12:21:01