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
相关产品推荐
相关产品推荐

