我正在使用MultiProcess库生成一个python进程,并在其中生成大约100个线程(3个类型,每个执行一个单独的函数并使用Queue)。
我希望我的进程在引发db标志时整齐地终止,从而终止所有线程和进程本身,并在一切结束后设置数据库级别终止标志。
这是我的方法: 一旦在数据库中设置了一个标志(我可以在生成线程后在进程代码的末尾轮询数据库),我可以退出退出我的进程的轮询循环。要杀死所有线程,我必须保留一个thread-id的数组,并向所有线程发送一个kill。 我需要将所有线程连同它们的连接一起被杀死(线程连接到mysql,mongo,并且有一个websocket连接线程到另一个服务器)。
如果某人有更好的方法,或者我的方法有任何缺点,请建议。
答案 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核心),你可以采用适用于您的方案的更多适当的高级架构。 :)