Python 子进程 Popen 并行化

Python Subprocess Popen Parallelization

Objective

工作状态

import subprocess 

count = 10
parallel = 2

processes = []
for i in range(0,count):
    while (len(processes) >= parallel):
        for process in processes:
            if (process.poll() is None):
                processes.remove(process)
                break
    process = subprocess.Popen(["cmd", "/c timeout 5"])
    processes.append(process)

[...]

我在某处读到,检查进程是否 运行 的好方法是 不是 None,如代码中所示。

问题

我不知何故很难正确设置它,尤其是 Popen([...]) 部分。在某些情况下,所有进程都在不考虑最大并行数的情况下执行,而在其他情况下,它根本不起作用。

我想一定有一个部分,如果完成了进程就关闭了。

谢谢!

您可能会更好地使用内置的多处理模块来管理子进程运行您的任务。

我将命令包装在字典中的原因是 imap_unordered(比 imap 快,但不保证按顺序执行,因为任何工作进程都可以获取任何工作——无论这对你来说没关系是你的业务问题)没有 starmap 替代方案,因此在可调用文件中解压缩单个“作业”更容易。

import multiprocessing
import subprocess


def run_command(job):
    # TODO: add other things here?
    subprocess.check_call(job["command"])


def main():
    with multiprocessing.Pool(2) as p:
        jobs = [{"command": ["cmd", "/c timeout 5"]} for x in range(10)]
        for result in p.imap_unordered(run_command, jobs):
            pass


if __name__ == "__main__":
    main()