You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多进程:任一函数结束后终止所有进程的实现方法

实现任一子进程结束后终止所有进程的方案

你的代码目前通过multiprocessing.Process启动了两个子进程,每个子进程又通过subprocess.call启动了新控制台的脚本。要实现任一进程结束后终止所有运行中的进程,需要解决两个核心问题:监控子进程的运行状态,以及终止时同时清理子进程启动的控制台脚本进程。

具体实现步骤

  1. 替换subprocess.call为subprocess.Popen,获取启动的控制台脚本进程对象,方便后续终止。
  2. 让每个multiprocessing子进程在收到终止信号时,先杀死自己启动的控制台脚本进程。
  3. 主进程轮询监控两个子进程的状态,一旦发现任一进程退出,立即终止另一个子进程。

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 10:48:22