终止一个进程及其所有线程
我正在使用MultiProcess库来启动一个Python进程,在这个进程里,我又启动了大约100个线程(这100个线程分成3种类型,每种类型执行不同的功能,并且使用一个队列)。
我希望当数据库中的一个标志被设置时,进程能够干净利落地结束,杀掉所有线程和进程本身,并且在一切结束后在数据库中设置一个“已终止”的标志。
我的想法是:一旦数据库中的标志被设置(我可以在启动线程后的代码末尾去检查数据库),我就可以退出这个检查循环,从而结束我的进程。为了杀掉所有线程,我需要保存一个线程ID的数组,然后对所有线程发送结束命令。 我需要确保所有线程都能被杀掉,并且它们的连接也会被关闭(这些线程连接着MySQL、MongoDB,还有一个连接到另一个服务器的WebSocket线程)。
如果有人有更好的方法,或者觉得我的方法有什么缺陷,请给我提建议。
2 个回答
1
你只需要结束这个进程,关键是要正确处理进程的结束信号。
我想你的问题在于“如何正确处理那些由进程创建的线程可能会突然终止的情况?”下面的两个链接可能会帮你找到答案:
- 有没有办法在Python中结束一个线程? https://stackoverflow.com/a/325528/428467
- python:当主程序结束时,如何终止一个线程? python:当主程序结束时,如何终止一个线程
附言:
我不太明白你为什么需要创建这么多进程(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)