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

pyt*_*nic 8 python multithreading

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

t = thread.start_new_thread(myfunction)
Run Code Online (Sandbox Code Playgroud)

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

t.kill()
Run Code Online (Sandbox Code Playgroud)

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

Pao*_*lli 20

在Python中,你根本无法杀死一个线程.

如果你真的不需要一个Thread(!),你可以做的,而不是使用线程包(http://docs.python.org/2/library/threading.html),就是使用多处理包(http://docs.python.org/2/library/multiprocessing.html).在这里,要杀死进程,您只需调用该方法:

yourProcess.terminate()  # kill the process!
Run Code Online (Sandbox Code Playgroud)

Python将终止你的进程(在Unix上通过SIGTERM信号,在Windows上通过TerminateProcess()调用).使用队列或管道时要注意使用它!(它可能会破坏队列/管道中的数据)

请注意,multiprocessing.Eventmultiprocessing.Semaphore的工作方式与threading.Eventthreading.Semaphore完全相同.事实上,第一个是后者的克隆.

如果您真的需要使用Thread,则无法直接杀死您的线程.但是,您可以使用"守护程序线程".事实上,在Python中,Thread可以被标记为守护进程:

yourThread.daemon = True  # set the Thread as a "daemon thread"
Run Code Online (Sandbox Code Playgroud)

当没有剩下活着的非守护程序线程时,主程序将退出.换句话说,当您的主线程(当然是非守护程序线程)将完成其操作时,即使仍有一些守护程序线程正在运行,程序也将退出.

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

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

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


Mar*_*tos 10

如果您的线程正在忙于执行Python代码,那么您遇到的问题比无法杀死它更大.GIL将阻止任何其他线程甚至运行您将用于执行查杀的任何指令.(经过一些研究,我得知解释器会定期发布GIL,因此前面的陈述是假的.但是,其余的评论仍然存在.)

您的主题必须以合作的方式编写.也就是说,它必须定期检查信号对象,例如信号量,主线程可以用它来指示工作线程自愿退出.

while not sema.acquire(False):
    # Do a small portion of work…
Run Code Online (Sandbox Code Playgroud)

要么:

for item in work:
    # Keep working…
        # Somewhere deep in the bowels…
        if sema.acquire(False):
            thread.exit()
Run Code Online (Sandbox Code Playgroud)

  • 我的线程正在等待 raw_input().... :S (2认同)

Ned*_*der 7

你不能从另一个线程中杀死一个线程.您需要向另一个线程发出信号,告知它应该结束.并且通过"信号"我并不意味着使用该signal功能,我的意思是你必须安排线程之间的一些通信.

  • 关键是我要杀死的线程可能忙于一个函数,如果它变得太忙(挂起,停滞),我想突然结束它. (3认同)