如何在异常后干净地停止多进程python程序?

时间:2011-09-26 19:28:45

标签: python exception-handling multiprocessing

我有一个Python程序,它有几个进程(现在只有2个)和线程(每个进程2个)。我想捕获每个异常,特别是在Ctrl + c上干净地关闭我的程序,但我无法让它工作。每次发生异常时,程序都会停止但不会正确关闭,从而使我无法使用命令行。

到目前为止我在伪代码中尝试的是:

try:
    for process in processes:
        process.join()
except:
    pass #Just to suppress error-messages, will be removed later
finally:
    for process in processes:
        process.terminate()

但正如我已经说过的那样没有运气。还要注意,我得到两个进程的异常错误消息,所以它们都停止了我相信吗?

也许我还应该提一下,大多数线程在监听管道时都被阻止了。

修改 所以我差点搞定了。我需要try:每个线程并确保线程正确连接。关闭时只有一个缺陷:Exception KeyboardInterrupt in <module 'threading' from '/usr/lib64/python2.7/threading.pyc'> ignored。这是在主进程的主线程中引发的。这个线程已经完成,这意味着它已经通过了最后一行代码。

1 个答案:

答案 0 :(得分:1)

问题(我希望)是在加入调用中而不是的进程内引发异常。

我建议你尝试在try-except循环中包装每个进程的main方法。然后有一个标志(例如multiprocessing.Value的实例),except语句设置为False。每个进程都可以检查标志的值,如果设置为False,则停止(自行清理)。

注意,如果您只是终止进程,它将不会自行清理,因为这与向其发送SIG_TERM相同。