2012-07-11 149 views
6

我使用下面的代码启动线程。我如何杀死python中的线程

t = thread.start_new_thread(myfunction) 

如何从另一个线程中删除线程t。所以基本上就代码而言,我希望能够做到这一点。

t.kill() 

请注意,我使用Python 2.4。

+0

请问为什么你使用低级*线程*模块而不是高级*线程*库? – 2012-07-11 11:48:19

回答

10

如果您的线程忙于执行Python代码,则会遇到比无法杀死它更大的问题。 GIL将阻止任何其他线程甚至运行您将用来执行杀戮的任何指令。 (经过一番调查,我了解到口译员会定期发布GIL,所以前面的陈述是虚假的,但是其余的评论仍然存在。)

您的帖子必须以合作的方式书写。也就是说,它必须定期检入一个信号对象,例如一个信号量,主线程可以用它来指示工作线程自动退出。

while not sema.acquire(False): 
    # Do a small portion of work… 

或:

for item in work: 
    # Keep working… 
     # Somewhere deep in the bowels… 
     if sema.acquire(False): 
      thread.exit() 
+0

如何获得'sema'? – 2016-04-16 02:37:11

+0

https://docs.python.org/2/library/threading.html#semaphore-objects – 2016-04-16 04:53:00

+1

我的线程正在等待raw_input()....:S – ntg 2016-11-21 18:56:28

7

你不能杀死另一个线程的线程。您需要通知其他线程它应该结束。而通过“信号”我并不是指使用signal函数,我的意思是你必须安排线程之间的一些通信。

+2

关键是我想杀死的线程可能在一个函数中很忙,如果它变得太忙(挂起,停顿),我想突然结束它。 – pythonic 2012-07-11 11:30:20

+1

制作线程不会更好,因此它不会挂起/停顿?通常情况下,你会使用某种互斥/ sempahore /标志来表示线程并使其脱离它的循环。 – DipSwitch 2012-07-11 11:32:29

+1

使用线程的超时,以及捕获该超时中断的信号处理程序。 – bos 2012-07-11 11:32:36

14

在Python,你根本无法杀死一个线程。

如果你并不真的需要有一个线程(!),你可以做什么,而不是使用线程包(http://docs.python.org/2/library/threading.html),是使用多处理包(http://docs.python.org/2/library/multiprocessing.html)。在这里,杀死一个进程,你可以简单地调用方法:

yourProcess.terminate() # kill the process! 

Python会杀了你的进程(通过SIGTERM信号在Unix上,而在Windows上通过了TerminateProcess()调用)。使用Queue或Pipe时请注意使用它! (它可能会损坏在队列/管中的数据)

注意,multiprocessing.Event并在threading.Event的相同的方式完全相同的multiprocessing.Semaphore工作和threading.Semaphore分别为。事实上,第一个是后者的克隆。

如果您确实需要使用线程,则无法直接杀死线程。但是,您可以执行的操作是使用“守护程序线程”。事实上,在Python,线程可以被标记为守护:没有活着的非守护线程离开时

yourThread.daemon = True # set the Thread as a "daemon thread" 

主程序将退出。换句话说,当你的主线程(当然是一个非守护线程)将完成它的操作时,即使仍然有一些守护线程正在工作,程序也将退出。

注意,有必要在开始前设置一个主题为守护()方法被调用!

当然,你可以,也应该使用守护即使多处理。在这里,当主进程退出时,它会尝试终止其所有的守护进程。

最后,请注意,sys.exit()os.kill()都没有选择。

+0

澄清线程vs多处理有http://stackoverflow.com/questions/18114285/python-what-are-the-differences-between-the-threading-and-multiprocessing-modul – 2015-10-15 11:02:59

+0

我喜欢这个答案....这是关于线索性质的普通的旧事实...... – repzero 2016-08-24 00:28:42