Linux下按6秒间隔启动命令、并行运行N个进程的最优方案咨询
优化方案说明
核心思路放弃原有的按批次提交逻辑,改为维护固定大小的运行中进程池,只要有进程结束就立即补位提交下一个待执行命令,同时保留两条命令启动间隔6秒的要求,避免空等同批次慢进程,大幅提升资源利用率。
Python实现代码
from subprocess import Popen import time from collections import deque # 读取命令列表,过滤空行避免执行错误 with open('commands.txt', 'r', encoding='utf-8') as f: all_commands = [cmd.strip() for cmd in f if cmd.strip()] MAX_CONCURRENT = 20 # 最大同时运行的进程数,和原有批次大小保持一致 running_processes = deque() # 存储正在运行的(进程对象, 命令索引) cmd_ptr = 0 # 下一个要执行的命令下标 last_launch_time = 0 # 上次启动进程的时间戳 while cmd_ptr < len(all_commands) or running_processes: # 先清理已经结束的进程 to_remove = [] for idx, (proc, cmd_idx) in enumerate(running_processes): if proc.poll() is not None: # 进程已结束 print(f"Command #{cmd_idx} finished, exit code: {proc.returncode}") to_remove.append(idx) # 倒序删除避免索引错乱 for idx in reversed(to_remove): del running_processes[idx] # 检查是否满足新进程启动条件:还有未执行命令+运行数未到上限+距离上次启动满6秒 now = time.time() if (cmd_ptr < len(all_commands) and len(running_processes) < MAX_CONCURRENT and now - last_launch_time >= 6): current_cmd = all_commands[cmd_ptr] proc = Popen(current_cmd, shell=True) running_processes.append((proc, cmd_ptr)) print(f"Command #{cmd_ptr} started: {current_cmd}") cmd_ptr += 1 last_launch_time = now # 避免空轮询占用CPU,短休眠即可 time.sleep(0.5)
其他说明
- 该方案相比原批次方案,执行效率随命令执行时长离散度提升而升高,极端场景下可提升50%以上的总执行速度
- 可直接修改
MAX_CONCURRENT参数调整最大并发数,适配不同性能的运行环境 - C语言实现逻辑完全一致:用pid_t数组存储运行中子进程ID,定期调用
waitpid(WNOHANG)回收结束子进程,满足启动条件时通过fork+exec启动新命令即可
内容的提问来源于stack exchange,提问作者User19
相关产品推荐
相关产品推荐

