11

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

t = thread.start_new_thread(myfunction)

我怎样才能t从另一个线程中杀死线程。所以基本上就代码而言,我希望能够做这样的事情。

t.kill()

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

4

3 回答 3

27

在 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.Eventmultiprocessing.Semaphore的工作方式分别与threading.Eventthreading.Semaphore完全相同。事实上,第一个是后者的克隆。

如果你真的需要使用线程,没有办法直接杀死你的线程。但是,您可以做的是使用“守护线程”。事实上,在 Python 中,可以将 Thread 标记为daemon

yourThread.daemon = True  # set the Thread as a "daemon thread"

当没有活着的非守护线程时,主程序将退出。换句话说,当你的主线程(当然是一个非守护线程)完成它的操作时,即使还有一些守护线程在工作,程序也会退出。

请注意,在调用start()方法之前,必须将 Thread 设置为守护进程!

当然,即使使用multiprocessing ,您也可以并且应该使用daemon。在这里,当主进程退出时,它会尝试终止其所有守护子进程。

最后,请注意sys.exit()os.kill()不是选择。

于 2013-03-03T12:47:25.283 回答
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()
于 2012-07-11T11:46:18.640 回答
7

你不能从另一个线程中杀死一个线程。您需要向另一个线程发出信号,表明它应该结束。我所说的“信号”并不是指使用该signal功能,我的意思是您必须安排线程之间的一些通信。

于 2012-07-11T11:27:52.763 回答