2010-04-01 95 views

回答

35

检查这个问题。正确的答案对如何终止线程的正确方法很好的解释: 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

+0

非常感谢您的回复。我可能没有正确说明问题。在该问题给出的例子中,仍然需要执行线程的stop()函数。当我通过ctrl + C异常终止一个程序时,这是不可能发生的。所以,我的问题有点像“如果主线程流被中断,我怎么称之为mythread.stop()函数” – facha 2010-04-01 23:08:19

+0

我编辑了我的问题:) – rogeriopvl 2010-04-01 23:44:16

+2

没有人注意到代码示例中的分号?爱着它! – 2017-01-24 19:02:20

65

如果你让你的工作线程守护线程,他们会死当你所有的非守护线程(例如主线程)已经退出。

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

+2

感谢您的简单和准确的答案,默认threading.Thread守护状态'isDaemon()'是假,把它真正的'setDaemon(真)'。 – Tony 2015-06-24 02:42:56

+1

这回答了这个问题,只是作品。一般来说,操作系统并没有问清楚如何彻底退出线程。 – 2015-07-26 20:27:06

9

使用atexit模块Python的标准库对主线程的任何合理的“干净”的终止,包括未捕获的异常,如寄存器,被调用(在主线程),“终止”功能KeyboardInterrupt。这种终止功能可能(虽然不可避免地在主线程中!)调用您需要的任何stop函数;以及将线程设置为daemon的可能性,为您提供正确设计所需系统功能的工具。

+0

请注意,此方法在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

4

如果您产卵像这样一个主题 - myThread = Thread(target = function) - 然后做myThread.start(); myThread.join()。当CTRL-C启动时,主线程不会退出,因为它正在等待阻止myThread.join()调用。要解决这个问题,只需在.join()调用中放置一个超时。超时时间可以和你想要的一样长。如果你想让它无限期地等待,只是把一个很长的超时,如99999。这也是很好的做法做myThread.daemon = True所以所有的线程退出主线程(非守护进程)退出时。

+0

'myThread.daemon = True'是解决这个问题的绝妙方案。 – Brannon 2017-08-25 21:40:04

+0

@Brannon'.daemon = True'不是一个可靠的解决方案。查看此主题以获取解释:https://stackoverflow.com/a/20598791/5562492 – 2017-10-19 20:47:23