如果我在一个无限循环中有一个线程终止线程,有没有办法来终止它当主程序结束(例如,当我按下ctrl+C
)?蟒蛇:如何在主程序结束
回答
检查这个问题。正确的答案对如何终止线程的正确方法很好的解释: Is there any way to kill a Thread in Python?
如果要对键盘中断信号(Ctrl + C)的线程停止,你可以捕获该异常“一个KeyboardInterrupt”和清理退出之前。像这样:
try:
start_thread()
except (KeyboardInterrupt, SystemExit):
cleanup_stop_thread()
sys.exit()
这样,当程序突然终止时,您可以控制该做什么。
您还可以使用内置的信号模块,可以让你设置信号处理(在特定情况下,SIGINT信号):http://docs.python.org/library/signal.html
如果你让你的工作线程守护线程,他们会死当你所有的非守护线程(例如主线程)已经退出。
http://docs.python.org/library/threading.html#threading.Thread.daemon
感谢您的简单和准确的答案,默认threading.Thread守护状态'isDaemon()'是假,把它真正的'setDaemon(真)'。 – Tony 2015-06-24 02:42:56
这回答了这个问题,只是作品。一般来说,操作系统并没有问清楚如何彻底退出线程。 – 2015-07-26 20:27:06
使用atexit模块Python的标准库对主线程的任何合理的“干净”的终止,包括未捕获的异常,如寄存器,被调用(在主线程),“终止”功能KeyboardInterrupt
。这种终止功能可能(虽然不可避免地在主线程中!)调用您需要的任何stop
函数;以及将线程设置为daemon
的可能性,为您提供正确设计所需系统功能的工具。
请注意,此方法在2.6.5之前的Python版本中不需要守护程序线程,请参阅http://stackoverflow.com/questions/3713360/python-2-6-x-theading-signals-atexit-fail-上某些版本。这是不幸的恕我直言,因为关机期间的守护进程线程在python 3.4之前有点混乱(http://bugs.python.org/issue19466)。如果你停止并且在你的atexit处理程序中加入你的守护进程线程,所有的都应该没问题,而且你的线程拆卸的序列化(可能是微不足道的)成本。 – NeilenMarais 2015-01-15 14:04:29
如果您产卵像这样一个主题 - myThread = Thread(target = function)
- 然后做myThread.start(); myThread.join()
。当CTRL-C启动时,主线程不会退出,因为它正在等待阻止myThread.join()
调用。要解决这个问题,只需在.join()调用中放置一个超时。超时时间可以和你想要的一样长。如果你想让它无限期地等待,只是把一个很长的超时,如99999。这也是很好的做法做myThread.daemon = True
所以所有的线程退出主线程(非守护进程)退出时。
'myThread.daemon = True'是解决这个问题的绝妙方案。 – Brannon 2017-08-25 21:40:04
@Brannon'.daemon = True'不是一个可靠的解决方案。查看此主题以获取解释:https://stackoverflow.com/a/20598791/5562492 – 2017-10-19 20:47:23
- 1. 在结束使用mysql-connector-蟒蛇
- 2. 结束一个循环,蟒蛇早期
- 3. Opencv蟒蛇程序
- 4. 蟒蛇线程(join()方法而不是等待线程结束?)
- 5. 如何在蟒蛇
- 6. 切片索引或结束,如果结束较小那么指数(蟒蛇)
- 7. CPLEX蟒蛇和约束
- 8. 小蟒蛇游戏程序
- 9. 如何蟒蛇
- 10. 如何蟒蛇
- 11. 如何结束程序(Python)?
- 12. 无法在蟒蛇蟒蛇
- 13. 蟒蛇:排序
- 14. 蟒蛇线程
- 15. 处理程序不是在GAE蟒蛇
- 16. 如何在硒蟒蛇
- 17. 如何在蟒蛇系列
- 18. 蟒蛇:如何在Linux的
- 19. 如何蟒蛇PIP在Windows
- 20. 蟒蛇:从主机串
- 21. 如何从蟒蛇
- 22. 你如何蟒蛇
- 23. 如何从蟒蛇
- 24. 如何从蟒蛇
- 25. 如何使蟒蛇
- 26. 如果在蟒蛇
- 27. 如果在蟒蛇
- 28. 如何在蟒蛇蟒蛇分布安装AWSCLI
- 29. 在线蟒蛇教程
- 30. 排序为蟒蛇
非常感谢您的回复。我可能没有正确说明问题。在该问题给出的例子中,仍然需要执行线程的stop()函数。当我通过ctrl + C异常终止一个程序时,这是不可能发生的。所以,我的问题有点像“如果主线程流被中断,我怎么称之为mythread.stop()函数” – facha 2010-04-01 23:08:19
我编辑了我的问题:) – rogeriopvl 2010-04-01 23:44:16
没有人注意到代码示例中的分号?爱着它! – 2017-01-24 19:02:20