如何在异常后优雅地停止多进程Python程序?

8 投票
1 回答
3210 浏览
提问于 2025-04-17 03:07

我有一个Python程序,它有几个进程(现在只有两个)和线程(每个进程有两个线程)。我想捕捉每一个异常,特别是在按下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:,并确保线程正确地合并(joined)。不过还有一个缺陷:在关闭时出现了Exception KeyboardInterrupt in <module 'threading' from '/usr/lib64/python2.7/threading.pyc'> ignored。这个异常是在主进程的主线程中引发的,而这个线程已经完成了,也就是说它已经执行到了最后一行代码。

1 个回答

1

我想问题出在异常是在进程内部被抛出的,而不是在调用合并的时候。

我建议你试着把每个进程的主要方法放在一个try-except循环里。然后设置一个标志(比如用multiprocessing.Value的实例),当捕获到异常时,这个标志会被设置为False。每个进程可以检查这个标志的值,如果是False,就可以停止运行并进行清理。

需要注意的是,如果你直接终止一个进程,它不会进行清理,因为这就像给它发送了一个SIG_TERM信号一样。

撰写回答