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

Python如何编写脚本同时运行a.py和b.py并循环调整参数自动重启

问题根因

你原来用线程的实现方式不符合需求,核心问题有3个:

  • 同一进程下的多个线程共享内存,a、b模块首次导入后配置就已经加载到内存中,后续你更新conf.json不会触发已加载模块的配置刷新,导致所有轮次用的都是第一组参数
  • 原代码没有等待两个线程运行结束就进入下一轮循环,会导致多组参数的任务同时运行,逻辑完全混乱
  • 线程无法实现和独立终端一致的隔离运行环境,a、b的运行状态会互相干扰
标准解决方案

要实现和两个独立终端运行完全一致的效果,应该用subprocess模块启动独立子进程,每个轮次启动新的子进程、结束后销毁,完全符合你的需求。

实现代码(c.py)

import json
import subprocess
import time

# 替换为你的预设参数列表
parameter_list = [
    {"mqtt_topic": "test1", "interval": 1},
    {"mqtt_topic": "test2", "interval": 2},
    {"mqtt_topic": "test3", "interval": 3}
]
CONF_PATH = "conf.json"

for params in parameter_list:
    # 1. 更新配置文件
    with open(CONF_PATH, "r", encoding="utf-8") as f:
        conf = json.load(f)
    # 按你的配置结构更新对应字段,这里直接全量覆盖示例
    conf.update(params)
    with open(CONF_PATH, "w", encoding="utf-8") as f:
        json.dump(conf, f, indent=4)
    
    # 2. 启动独立子进程运行a.py和b.py,和终端运行效果完全一致
    # Windows环境下如果python命令报错,可替换为"py"或python.exe完整路径
    proc_a = subprocess.Popen(["python", "a.py"])
    proc_b = subprocess.Popen(["python", "b.py"])
    print(f"当前参数组{params}启动完成,子进程PID:a={proc_a.pid}, b={proc_b.pid}")

    try:
        # 3. 等待运行完成,根据你的实际场景二选一:
        # 场景A:a、b运行完会自动退出,设置超时防止卡死(超时时间单位秒,按需修改)
        exit_a = proc_a.wait(timeout=300)
        exit_b = proc_b.wait(timeout=300)
        print(f"当前参数组运行结束,a退出码:{exit_a},b退出码:{exit_b}")

        # 场景B:a、b是常驻服务,需要运行指定时长后手动关闭,注释掉上面的wait,用下面的代码
        # time.sleep(60) # 运行60秒后关闭
        # proc_a.terminate()
        # proc_b.terminate()
        # proc_a.wait()
        # proc_b.wait()
        # print("当前参数组运行时长达标,子进程已关闭")
    except subprocess.TimeoutExpired:
        # 超时强制杀死进程,避免资源泄漏
        print("运行超时,强制终止子进程")
        proc_a.kill()
        proc_b.kill()
        proc_a.wait()
        proc_b.wait()
    
    # 轮次间隔,避免MQTT连接、文件读写冲突
    time.sleep(2)

注意事项

  • a.py、b.py不需要修改,保证直接在终端运行python a.py能正常工作即可
  • 如果需要查看a、b的运行日志,删除Popen里的stdout、stderr参数即可,子进程的输出会直接打印到当前终端
  • 如果a、b是在模块加载阶段就读取conf.json,代码里先写配置再启动子进程的顺序是正确的,每个子进程都会读取最新的配置文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:45:01