我使用以下代码启动一个线程。
t = thread.start_new_thread(myfunction)
我怎样才能t
从另一个线程中杀死线程。所以基本上就代码而言,我希望能够做这样的事情。
t.kill()
请注意,我使用的是 Python 2.4。
我使用以下代码启动一个线程。
t = thread.start_new_thread(myfunction)
我怎样才能t
从另一个线程中杀死线程。所以基本上就代码而言,我希望能够做这样的事情。
t.kill()
请注意,我使用的是 Python 2.4。
在 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 标记为daemon:
yourThread.daemon = True # set the Thread as a "daemon thread"
当没有活着的非守护线程时,主程序将退出。换句话说,当你的主线程(当然是一个非守护线程)完成它的操作时,即使还有一些守护线程在工作,程序也会退出。
请注意,在调用start()方法之前,必须将 Thread 设置为守护进程!
当然,即使使用multiprocessing ,您也可以并且应该使用daemon。在这里,当主进程退出时,它会尝试终止其所有守护子进程。
最后,请注意sys.exit()和os.kill()不是选择。
如果您的线程忙于执行 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()
你不能从另一个线程中杀死一个线程。您需要向另一个线程发出信号,表明它应该结束。我所说的“信号”并不是指使用该signal
功能,我的意思是您必须安排线程之间的一些通信。