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



我有一个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()

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

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

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

问题(我认为)是异常是在进程而不是在join调用中引发的。

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

注意,如果你只是终止一个进程,它不会自己清理,因为这与向它发送SIG_TERM是一样的。

最新更新