我使用以下代码启动一个线程。
如何从另一个线程杀死线程
请注意,我正在使用Python 2.4版本。
t = thread.start_new_thread(myfunction)
如何从另一个线程杀死线程
t
。简单来说,我想要做的事情就是这样的。请看下面的代码:t.kill()
请注意,我正在使用Python 2.4版本。
t = thread.start_new_thread(myfunction)
t
。简单来说,我想要做的事情就是这样的。请看下面的代码:t.kill()
在Python中,你无法直接终止一个线程。
如果你实际上不需要使用线程,而是使用multiprocessing包(http://docs.python.org/2/library/multiprocessing.html)替代threading包(http://docs.python.org/2/library/threading.html),那么你可以通过调用以下方法来终止一个进程:
yourProcess.terminate() # kill the process!
Python会通过SIGTERM信号(在Unix上)或TerminateProcess()调用(在Windows上)来终止进程。在使用Queue或Pipe时要注意使用它!(它可能会破坏Queue/Pipe中的数据)
请注意,multiprocessing.Event和multiprocessing.Semaphore的工作方式与threading.Event和threading.Semaphore完全相同。实际上,前者是后者的克隆。
如果您真的需要使用线程,则无法直接终止线程。但是,您可以使用“守护线程”。实际上,在Python中,线程可以标记为“守护进程”:
yourThread.daemon = True # set the Thread as a "daemon thread"
如果你的线程正在执行 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
? - Frozen Flame你无法从另一个线程杀死一个线程。你需要向另一个线程发出信号,告诉它应该结束。这里的“信号”不是指使用signal
函数,而是指你必须安排一些线程之间的通信。