我有一个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
。这是在主进程的主线程中引发的。这个线程已经完成,这意味着它已经通过了最后一行代码。
答案 0 :(得分:1)
问题(我希望)是在加入调用中而不是的进程内引发异常。
我建议你尝试在try-except循环中包装每个进程的main方法。然后有一个标志(例如multiprocessing.Value的实例),except语句设置为False。每个进程都可以检查标志的值,如果设置为False,则停止(自行清理)。
注意,如果您只是终止进程,它将不会自行清理,因为这与向其发送SIG_TERM相同。