我怎么能在python中杀死一个线程

时间:2012-07-11 11:27:02

标签: python multithreading

我使用以下代码启动一个线程。

t = thread.start_new_thread(myfunction)

如何从另一个线程中杀死线程t。所以基本上在代码方面,我希望能够做到这样的事情。

t.kill()

请注意,我使用的是Python 2.4。

3 个答案:

答案 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函数,我的意思是你必须在线程之间安排一些通信。