Python多进程:任一函数结束后终止所有进程的实现方法
实现任一子进程结束后终止所有进程的方案
你的代码目前通过multiprocessing.Process启动了两个子进程,每个子进程又通过subprocess.call启动了新控制台的脚本。要实现任一进程结束后终止所有运行中的进程,需要解决两个核心问题:监控子进程的运行状态,以及终止时同时清理子进程启动的控制台脚本进程。
具体实现步骤
- 替换
subprocess.call为subprocess.Popen,获取启动的控制台脚本进程对象,方便后续终止。 - 让每个
multiprocessing子进程在收到终止信号时,先杀死自己启动的控制台脚本进程。 - 主进程轮询监控两个子进程的状态,一旦发现任一进程退出,立即终止另一个子进程。
修改后的完整代码
import multiprocessing import subprocess import time import signal def startp1(stop_event): # 用Popen启动脚本,获取进程对象 proc = subprocess.Popen('python teste.py', creationflags=subprocess.CREATE_NEW_CONSOLE) try: # 等待脚本结束,或者等待终止信号 proc.wait() finally: # 如果是被终止信号打断,杀死控制台脚本进程 if proc.poll() is None: proc.terminate() proc.wait() # 触发停止事件,通知主进程 stop_event.set() def startp2(stop_event): proc = subprocess.Popen('python teste2.py', creationflags=subprocess.CREATE_NEW_CONSOLE) try: proc.wait() finally: if proc.poll() is None: proc.terminate() proc.wait() stop_event.set() if __name__ == '__main__': # 创建跨进程事件,用于通知主进程终止 stop_event = multiprocessing.Event() p1 = multiprocessing.Process(target=startp1, args=(stop_event,)) p2 = multiprocessing.Process(target=startp2, args=(stop_event,)) p1.start() p2.start() # 轮询监控进程状态 while True: if not p1.is_alive() or not p2.is_alive() or stop_event.is_set(): # 终止仍在运行的子进程 if p1.is_alive(): p1.terminate() p1.join() if p2.is_alive(): p2.terminate() p2.join() break time.sleep(0.5)
代码说明
stop_event是跨进程事件对象,任一子进程结束时会触发该事件,通知主进程执行终止逻辑。- 子进程内用
Popen启动控制台脚本,finally块确保无论正常结束还是被终止,都会先清理启动的脚本进程,避免遗留孤儿进程。 - 主进程通过循环检查子进程状态和事件触发情况,一旦满足终止条件,立即主动终止剩余子进程并等待其退出。
内容的提问来源于stack exchange,提问作者guilhermeguim
相关产品推荐
相关产品推荐

