我使用以下代码启动一个线程。
t = thread.start_new_thread(myfunction)
如何从另一个线程中杀死线程t
。所以基本上在代码方面,我希望能够做到这样的事情。
t.kill()
请注意,我使用的是Python 2.4。
答案 0 :(得分:20)
在Python中,你根本无法杀死一个线程。
如果你真的不需要一个线程(!),你可以做的,而不是使用线程包(http://docs.python.org/2/library/threading.html),是使用多处理包(http://docs.python.org/2/library/multiprocessing.html)。在这里,要杀死进程,您只需调用方法:
yourProcess.terminate() # kill the process!
Python将终止你的进程(在Unix上通过SIGTERM信号,而在Windows上通过TerminateProcess()调用)。使用队列或管道时要注意使用它! (它可能会破坏队列/管道中的数据)
请注意, multiprocessing.Event 和 multiprocessing.Semaphore 的工作方式与 threading.Event 和 threading.Semaphore 分别。事实上,第一批是后者的克隆。
如果您真的需要使用线程,则无法直接终止线程。但是,您可以使用“守护程序线程”。实际上,在Python中,Thread可以标记为守护程序:
yourThread.daemon = True # set the Thread as a "daemon thread"
当没有剩下活着的非守护程序线程时,主程序将退出。换句话说,当您的主线程(当然是非守护程序线程)将完成其操作时,即使仍有一些守护程序线程正在运行,程序也会退出。
请注意,在调用 start()方法之前,必须将Thread设置为守护程序!
当然,即使使用多处理,您也可以并且应该使用守护程序。这里,当主进程退出时,它会尝试终止所有守护进程的子进程。
最后,请注意 sys.exit()和 os.kill()不是选择。
答案 1 :(得分: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()
答案 2 :(得分:7)
你不能从另一个线程中杀死一个线程。您需要向另一个线程发出信号,告知它应该结束。并且通过“信号”我并不是指使用signal
函数,我的意思是你必须在线程之间安排一些通信。