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

如何在Python多进程中返回非零退出码并立即终止脚本?

多进程并行执行并快速终止方案

核心问题修正与关键点

  1. 子进程返回值 vs sys.exit:在被multiprocessing.Process调用的函数里,return 1和sys.exit(1)效果一致,都会将子进程的exitcode设为1。但用return更符合函数的返回逻辑,推荐使用;如果函数中出现未捕获的异常,子进程的exitcode会是负数(比如-1表示未捕获的Exception),也需要判定为错误。
  2. 进程管理:要把所有创建的进程存入列表,避免覆盖变量;启动所有进程后,需要实时监控每个进程的运行状态,一旦发现异常立即终止所有进程。
  3. 错误触发后的处理:只要有一个进程退出码非0,立刻给其他存活的进程发送终止信号(terminate()),然后主进程以非零码退出。

完整可运行代码

import multiprocessing
import sys

def a(a1):
    # 替换为实际业务逻辑,示例用a1 == 1作为成功条件
    target_val = 1
    if a1 == target_val:
        print("Function a success")
        return 0
    else:
        print("Function a failure")
        return 1

def b(b1):
    # 替换为实际业务逻辑,示例用b1 == 2作为成功条件
    target_val = 2
    if b1 == target_val:
        print("Function b success")
        return 0
    else:
        print("Function b failure")
        return 1

def runall():
    # 定义函数参数
    a_args = (1,)
    b_args = (3,)  # 故意设为错误值,测试异常终止逻辑

    # 创建进程列表
    processes = []
    p1 = multiprocessing.Process(target=a, args=a_args)
    p2 = multiprocessing.Process(target=b, args=b_args)
    processes.extend([p1, p2])

    # 启动所有进程
    for p in processes:
        p.start()

    # 监控进程状态
    try:
        while True:
            # 逐个检查进程状态
            for p in processes:
                if not p.is_alive():
                    # 进程已退出,校验退出码
                    if p.exitcode != 0:
                        print(f"Process {p.name} failed with exit code {p.exitcode}, terminating all processes")
                        # 终止所有存活进程
                        for proc in processes:
                            if proc.is_alive():
                                proc.terminate()
                                proc.join()
                        # 主进程返回非零码退出
                        sys.exit(1)
            # 所有进程正常完成则退出
            if all(not p.is_alive() for p in processes):
                print("All processes completed successfully")
                sys.exit(0)
    except KeyboardInterrupt:
        # 处理手动中断场景
        print("Received interrupt, terminating all processes")
        for p in processes:
            if p.is_alive():
                p.terminate()
                proc.join()
        sys.exit(1)

if __name__ == '__main__':
    runall()

代码说明

  • 进程创建与启动:将所有进程存入列表统一管理,避免单个变量覆盖导致进程丢失。
  • 实时监控:循环检查进程存活状态,一旦发现异常退出的进程,立即终止其他进程。
  • 异常处理:捕获手动中断信号,确保所有进程能被正确终止。
  • 退出逻辑:所有进程正常完成时主进程返回0,任一进程出错则返回1。

内容的提问来源于stack exchange,提问作者user12252991

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:05:31