Python 子进程 Popen 并行化
Python Subprocess Popen Parallelization
Objective
- 具有多个输入参数的进程 (.exe)
- 多个文件。对于每个上述过程都应执行
- 我想使用python来并行化进程
- 我正在使用 subprocess.Popen 创建进程,然后最多保留 N 个并行进程。
- 出于测试目的,我想并行化一个简单的脚本,例如“cmd timeout 5”。
工作状态
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()
Objective
- 具有多个输入参数的进程 (.exe)
- 多个文件。对于每个上述过程都应执行
- 我想使用python来并行化进程
- 我正在使用 subprocess.Popen 创建进程,然后最多保留 N 个并行进程。
- 出于测试目的,我想并行化一个简单的脚本,例如“cmd timeout 5”。
工作状态
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()