在python中出现错误时退出所有线程

2024-06-26 13:50:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个python项目,如果我希望我的线程有与C中相同的行为。在C中,当主线程退出时,它会杀死所有其他线程。在

该项目包含一个TCP错误服务器,用于从其他线程和其他软件获取日志。TCP链接是单工的。 有些错误一定涉及到整个程序的结束。在

  • 对于外部软件,我可以使用它们的PID杀死它们。在
  • 对于我尝试过的其他线程,sys._exit(),有时它可以工作,有时一些线程仍然存在。在

如果我的其他线程在循环,我可以使用semaphore或类似的东西,但它只是线性过程的一次迭代。在

我考虑过设计模式Producer/Consumer或者添加了很多lock.acquire()/lock.release(),但我认为它会增加更多的复杂性,意味着打破了线性线程。在

我已经看过其他Stackoverflow问题,我找到了这些解决方案:

  • 使用sys._exit(),但其成功率不是100%。在
  • 将我的线程转换成subprocess以轻松地杀死它们,但在我的情况下我不能

我正在寻找一个解决方案,一个设计模式或其他什么来解决它。在

PS:我是一个C爱好者,每次处理Python时,我都会想到一些简单的解决方案,比如调用exit()来杀死我所有的线程。在


Tags: 项目程序服务器lock链接错误sysexit
1条回答
网友
1楼 · 发布于 2024-06-26 13:50:15

如果你让你的工作线程守护进程线程,当你所有的非守护进程线程(例如主线程)都退出时,它们就会死掉。在

http://docs.python.org/library/threading.html#threading.Thread.daemon

线程守护程序状态isDaemon()False,通过setDaemon(True)设置它True

另一个解决方案:

要使线程在键盘中断信号(ctrl+c)上停止,您可以在退出前捕捉异常“KeyboardInterrup”并进行清理。像这样:

try:
    start_thread() #And the rest of your main  
except (KeyboardInterrupt, SystemExit):
    cleanup_stop_thread();
    sys.exit()

相关问题 更多 >