从同一进程中杀死进程及其所有线程

时间:2014-03-12 08:33:49

标签: python multithreading multiprocessing multiprocess

我正在使用MultiProcess库生成一个python进程,并在其中生成大约100个线程(3个类型,每个执行一个单独的函数并使用Queue)。

我希望我的进程在引发db标志时整齐地终止,从而终止所有线程和进程本身,并在一切结束后设置数据库级别终止标志。

这是我的方法: 一旦在数据库中设置了一个标志(我可以在生成线程后在进程代码的末尾轮询数据库),我可以退出退出我的进程的轮询循环。要杀死所有线程,我必须保留一个thread-id的数组,并向所有线程发送一个kill。 我需要将所有线程连同它们的连接一起被杀死(线程连接到mysql,mongo,并且有一个websocket连接线程到另一个服务器)。

如果某人有更好的方法,或者我的方法有任何缺点,请建议。

2 个答案:

答案 0 :(得分:1)

这是你可以尝试的,但不能保证。此函数终止整个进程树。

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)

答案 1 :(得分:1)

您只需要终止进程,您需要做的就是正确处理进程的kill信号。

我想你的问题在于“如何正确处理由进程创建的那些线程的潜在突然终止?”。以下两个答案可能会帮助您解决问题:

P.S。

我不知道为什么你需要创建这么多进程(100+对于现在普通计算机来说真的太多了,它们具有等于或少于4个CPU核心),你可以采用适用于您的方案的更多适当的高级架构。 :)