2015-02-24 61 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