我使用下面的代码启动线程。我如何杀死python中的线程
t = thread.start_new_thread(myfunction)
如何从另一个线程中删除线程t
。所以基本上就代码而言,我希望能够做到这一点。
t.kill()
请注意,我使用Python 2.4。
我使用下面的代码启动线程。我如何杀死python中的线程
t = thread.start_new_thread(myfunction)
如何从另一个线程中删除线程t
。所以基本上就代码而言,我希望能够做到这一点。
t.kill()
请注意,我使用Python 2.4。
如果您的线程忙于执行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()
如何获得'sema'? – 2016-04-16 02:37:11
https://docs.python.org/2/library/threading.html#semaphore-objects – 2016-04-16 04:53:00
我的线程正在等待raw_input()....:S – ntg 2016-11-21 18:56:28
你不能杀死另一个线程的线程。您需要通知其他线程它应该结束。而通过“信号”我并不是指使用signal
函数,我的意思是你必须安排线程之间的一些通信。
在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()都没有选择。
澄清线程vs多处理有http://stackoverflow.com/questions/18114285/python-what-are-the-differences-between-the-threading-and-multiprocessing-modul – 2015-10-15 11:02:59
我喜欢这个答案....这是关于线索性质的普通的旧事实...... – repzero 2016-08-24 00:28:42
请问为什么你使用低级*线程*模块而不是高级*线程*库? – 2012-07-11 11:48:19