Python多处理:如何在出错后彻底退出?

时间:2014-05-17 23:03:25

标签: python-2.7 multiprocessing

我正在编写一些使用multiprocessing模块的代码。但是,由于我是新手,经常发生的是弹出一些错误,停止主应用程序。

但是,应用程序的子项仍然在运行,我在任务管理器列表中获得了一长串运行pythonw进程的列表。

发生错误后,我该怎样做才能确保所有子进程都被杀死?

1 个答案:

答案 0 :(得分:5)

这个难题有两个部分。

  1. 如何检测并杀死所有子进程?
  2. 如果一个进程死亡,我怎样才能尽最大努力确保第1部分的代码运行?
  3. 对于第1部分,您可以使用multiprocessing.active_children()获取所有活动子项的列表,并使用Process.terminate()将其终止。请注意Process.terminate()的使用附带常见警告。

    from multiprocessing import Process
    import multiprocessing
    
    def f(name):
        print 'hello', name
        while True: pass
    
    if __name__ == '__main__':
        for i in xrange(5):
            p = Process(target=f, args=('bob',))
            p.start()
    
        # At user input, terminate all processes.
        raw_input("Press Enter to terminate: ")
        for p in multiprocessing.active_children():
           p.terminate()
    

    第2部分的一个解决方案是使用sys.excepthook,如this answer中所述。这是一个组合的例子。

    from multiprocessing import Process
    import multiprocessing
    import sys
    from  time import sleep
    
    def f(name):
        print 'hello', name
        while True: pass
    
    def myexcepthook(exctype, value, traceback):
        for p in multiprocessing.active_children():
           p.terminate()
    
    if __name__ == '__main__':
        for i in xrange(5):
            p = Process(target=f, args=('bob',))
            p.start()
        sys.excepthook = myexcepthook
    
        # Sleep for a bit and then force an exception by doing something stupid.
        sleep(1)
        1 / 0