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

Nob*_*ody 7 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()
Run Code Online (Sandbox Code Playgroud)

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

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

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

ed.*_*ed. 1

问题(我期望)是异常是在进程内部而不是在连接调用中引发的。

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

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