有没有办法强行杀死python中的线程?

Posted

技术标签:

【中文标题】有没有办法强行杀死python中的线程?【英文标题】:Is there a way to forcibly kill a thread in python? 【发布时间】:2021-11-04 14:22:30 【问题描述】:

在我的程序中,我有一个线程持续侦听 UDP 套接字,如果它收到任何消息,则将其放入队列中。 其他线程基本上是程序的主要部分。 所以当我想巧妙地终止程序时。所以我想要一种方法来强制(但巧妙地)杀死线程,或者定期从套接字的recv() 出来,以便我可以检查一些状态变量并在需要时退出。

【问题讨论】:

【参考方案1】:

强制终止线程通常是不好的做法,应尽可能避免。

根据the docs:

守护线程在关闭时突然停止。他们的资源(例如 如打开的文件、数据库事务等)可能不会被释放 适当地。如果你想让你的线程优雅地停止,让它们 非守护进程并使用合适的信号机制,例如事件。

基于此信息,我建议使用事件关闭线程。这里有一个很好的例子:Is there any way to kill a Thread?

【讨论】:

【参考方案2】:

这是我经常使用的:

import threading


class CustomThread(threading.Thread):
    def __init__(self, *args, **kwargs):
        super(CustomThread, self).__init__(*args, **kwargs)
        self._stopper = threading.Event()
    
def stop(self):
    self._stopper.set()

def stopped(self):
    return self._stopper.isSet()

def run(self):
    while not self.stopped():
        """
        The Code executed by your Thread comes here.
        Keep in mind that you have to use recv() in a non-blocking manner
        """

if __name__ == "__main__":
    t = CustomThread()
    t.start()
    # ...
    t.stop()

【讨论】:

以上是关于有没有办法强行杀死python中的线程?的主要内容,如果未能解决你的问题,请参考以下文章

线程中的阻塞语句导致杀死线程的时间更长?

android系统下, 如何确定一个切换到后台的应用是被系统杀死的

android 怎么永久杀死进程

可杀死线程类中的编译错误

Java中的杀死或销毁或退出线程[重复]

有没有办法在应用程序被杀死时接收数据通知?