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

如何利用多CPU控制最多2个Python脚本同时运行?

控制Python脚本并发执行的解决方案

问题描述

我有一台4核PC,需要实现最多同时运行2个Python脚本的逻辑:启动2个脚本,当其中一个运行结束后立即启动下一个,始终保持不超过2个脚本在运行。后续会升级为8核,届时会调整并发数,但目前需先实现2个并发的逻辑。我当前编写的代码虽创建了进程池(Pool)但未正确使用,导致所有脚本被同时启动,不符合需求。

我的错误代码如下:

import multiprocessing
from multiprocessing import Pool
import os

def run_script(script_file):
    print("Running script:", script_file)
    os.system("python " + script_file)

if __name__ == "__main__":
    pool = Pool(processes=2)    # start 2 worker processes
    #Hardcode Script Files for Now, Later Read Directory Contents and Build This Dynamically as it will grow alot
    script_files = ["scratch_6.py", "scratch_7.py", "scratch_8.py", "scratch_9.py", "scratch_10.py", "scratch_11.py", "scratch_12.py", "scratch_13.py"]
    processes = []
    for script_file in script_files:
        process = multiprocessing.Process(target=run_script, args=(script_file,))
        processes.append(process)

    for process in processes:
        process.start()

    for process in processes:
        process.join()

错误原因

你创建了进程池Pool但完全没用到它,反而手动遍历脚本列表创建了所有Process对象并一次性启动,导致所有脚本同时运行,完全没利用进程池的并发控制能力。

正确实现代码

import os
from multiprocessing import Pool

def run_script(script_file):
    print(f"Running script: {script_file} (PID: {os.getpid()})")
    # 替换os.system为subprocess,避免命令注入风险,同时获取执行状态
    import subprocess
    result = subprocess.run(["python", script_file], check=False)
    print(f"Script {script_file} finished with return code: {result.returncode}")

if __name__ == "__main__":
    # 并发数配置,后续升级8核时直接改这个值即可
    CONCURRENT_NUM = 2
    # 脚本列表,后续可改为动态读取目录生成
    script_files = ["scratch_6.py", "scratch_7.py", "scratch_8.py", "scratch_9.py", "scratch_10.py", "scratch_11.py", "scratch_12.py", "scratch_13.py"]
    
    # 使用进程池管理并发,上下文管理器自动处理池的创建与销毁
    with Pool(processes=CONCURRENT_NUM) as pool:
        # map自动分配任务,始终保持不超过CONCURRENT_NUM个进程运行
        pool.map(run_script, script_files)

关键说明

  1. 进程池核心逻辑:with Pool(...)上下文管理器简化了池的生命周期管理,pool.map()会自动将任务分配给worker进程,严格控制并发数,一个任务完成后立即启动下一个。
  2. 安全性与可维护性:用subprocess.run替代os.system,避免脚本文件名含特殊字符时的命令注入问题,同时能获取脚本执行的返回码,便于排查问题。
  3. 后续扩展适配:升级到8核时,只需修改CONCURRENT_NUM的值为8,核心逻辑无需改动,完全适配硬件升级需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:17:29