终止一个进程及其所有线程

0 投票
2 回答
2584 浏览
提问于 2025-04-17 21:54

我正在使用MultiProcess库来启动一个Python进程,在这个进程里,我又启动了大约100个线程(这100个线程分成3种类型,每种类型执行不同的功能,并且使用一个队列)。

我希望当数据库中的一个标志被设置时,进程能够干净利落地结束,杀掉所有线程和进程本身,并且在一切结束后在数据库中设置一个“已终止”的标志。

我的想法是:一旦数据库中的标志被设置(我可以在启动线程后的代码末尾去检查数据库),我就可以退出这个检查循环,从而结束我的进程。为了杀掉所有线程,我需要保存一个线程ID的数组,然后对所有线程发送结束命令。 我需要确保所有线程都能被杀掉,并且它们的连接也会被关闭(这些线程连接着MySQL、MongoDB,还有一个连接到另一个服务器的WebSocket线程)。

如果有人有更好的方法,或者觉得我的方法有什么缺陷,请给我提建议。

2 个回答

1

你只需要结束这个进程,关键是要正确处理进程的结束信号。

我想你的问题在于“如何正确处理那些由进程创建的线程可能会突然终止的情况?”下面的两个链接可能会帮你找到答案:

附言:

我不太明白你为什么需要创建这么多进程(100个以上对于现在的普通电脑来说真的太多了,通常只有4个或更少的CPU核心),也许你可以考虑一个更合适的高层架构来解决你的问题。:)

2

这是你可以尝试的一个方法,但不能保证一定有效。这个功能会终止整个进程树。

import psutil , os
def kill_proc_tree(pid, including_parent=True):    
    parent = psutil.Process(pid)
    for child in parent.get_children(recursive=True):
        child.kill()
    if including_parent:
        # Set the db terminate flag.

        # the next step will kill the whole process
        parent.kill()

# when Db flag iss set run this function
def terminate():
    me = os.getpid()
    kill_proc_tree(me)

撰写回答