在python

时间:2016-12-23 08:56:28

标签: python multithreading

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

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

  • 对于外部软件,我可以使用PID
  • 杀死它们
  • 对于我尝试sys._exit()的其他主题,有时会有效,有时会留下一些主题。

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

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

我已经查看了其他Stackoverflow问题,我发现了这些解决方案:

  • 使用sys._exit(),但其成功率不是100%。
  • 将我的主题转换为subprocess以轻易杀死他们,但就我而言,我无法做到。

我正在寻找解决方案,设计模式或其他解决方法。

PS:我是一个C爱好者,每次我处理Python时,我认为解决方案就像调用exit()来杀死我的所有线程一样简单。

1 个答案:

答案 0 :(得分:1)

如果您创建了工作线程守护程序线程,那么当所有非守护程序线程(例如主线程)退出时,它们将会死亡。

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

线程守护程序状态isDaemon()False,按True

设置setDaemon(True)

另一个解决方案:

要使线程在键盘中断信号(ctrl + c)上停止,你可以捕获异常" KeyboardInterrup"退出前清理。像这样:

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