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

Python中如何在子进程提前退出时无阻塞重启对应进程

无阻塞检测异常终止子进程并重启的实现方案

核心实现逻辑

  • 主进程先维护一份子进程映射表,存储子进程标识(Q1/Q2)和对应的启动命令、运行时实例/pid的对应关系,确保异常退出时能精准找到要重启的目标,不会影响其他正常运行的子进程
  • 采用非阻塞的状态检测逻辑,不要使用会卡住主进程的wait()类阻塞接口:类Unix系统可调用waitpid(pid, &status, WNOHANG),Windows系统可调用GetExitCodeProcess(),两个接口调用后会立即返回,不会阻塞主进程其他逻辑
  • 常规同步场景下可加一个轻量定时巡检逻辑,比如每100ms轮询一次所有子进程的状态,巡检间隔可根据你对重启时延的要求调整,资源消耗极低
  • 如果你用的是带异步事件循环的 runtime(比如Node.js、Rust tokio、Go),可以不用主动巡检,直接绑定子进程的退出事件回调,子进程终止时会自动触发回调执行重启逻辑,资源占用更低
  • 检测到某个子进程退出后,直接调用对应启动命令重启,更新映射表中的运行时信息即可

代码示例(Python)

import subprocess
import time
from threading import Lock, Thread

# 子进程配置:key为子进程标识,value为启动命令数组
process_config = {
    "Q1": ["python", "q1_task.py"],
    "Q2": ["python", "q2_task.py"]
}

# 运行时进程表,存储当前存活的子进程实例
running_processes = {}
lock = Lock()

def start_process(name: str):
    """启动指定子进程并更新运行时表"""
    proc = subprocess.Popen(process_config[name])
    with lock:
        running_processes[name] = proc
    print(f"子进程{name}启动完成,pid: {proc.pid}")

def monitor_processes():
    """无阻塞巡检子进程状态,异常退出自动重启"""
    while True:
        with lock:
            for name, proc in running_processes.items():
                # poll()为非阻塞方法,返回None说明进程正常运行,返回其他值为退出码
                exit_code = proc.poll()
                if exit_code is not None:
                    print(f"子进程{name}异常退出,退出码: {exit_code},正在重启...")
                    start_process(name)
        # 巡检间隔可根据需求调整,这里设为100ms
        time.sleep(0.1)

if __name__ == "__main__":
    # 首次启动所有子进程
    for proc_name in process_config:
        start_process(proc_name)
    # 启动独立监控线程,不会阻塞主进程其他业务逻辑
    monitor_thread = Thread(target=monitor_processes, daemon=True)
    monitor_thread.start()
    
    # 主进程其他业务逻辑写在此处,不会被监控逻辑阻塞
    while True:
        time.sleep(3600)

注意事项

  • 类Unix系统下注意处理SIGCHLD信号,避免退出的子进程变成僵尸进程,如果所用的语言/框架已经自带僵尸进程回收逻辑可忽略,手动处理可在信号回调中调用waitpid(-1, &status, WNOHANG)批量回收
  • 建议加重启频率限制,避免子进程启动即崩溃的场景下主进程无限重启,比如规则设为1分钟内重启超过5次就暂停重启,触发告警通知人工排查
  • 子进程的标准输出、错误输出建议单独重定向到日志文件,方便后续排查异常退出的原因

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:45:01