等待多个Python进程在Windows 7 CMD中完成

时间:2018-01-05 10:59:07

标签: python windows cmd parallel-processing

我试图在Windows 7(和10)中并行运行多个Python脚本。我正在从另一个Python脚本运行它们,该脚本在脚本正在编辑的文件上执行更多功能。我希望外部脚本等到其他脚本运行完毕。我已经尝试了start /w,但这使得每个脚本在关闭控制台窗口之前都会等待。

基本上我想做的是让Python等到3个进程完成。最后一个脚本只是一个print("done"),对我所关心的一切都毫无意义。这对我来说很重要,因为我需要用30做同样的事情。(在服务器上,有足够的可用线程。)

这是我试图运行的CMD命令。

os.system("start python node1.py & start python node2.py & start python node3.py && start /w printstatement.py")

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

使用subprocess.Popen代替os.system。您将获得3个Popen个实例,您可以等待。例如:

import subprocess

procs = [subprocess.Popen(['python', 'node{}.py'.format(n)]) 
            for n in range(1, 4)]

retcodes = [p.wait() for p in procs]

如果您想要单独的控制台窗口,例如CMD start命令的工作方式,请将选项creationflags=subprocess.CREATE_NEW_CONSOLE添加到Popen调用(仅限Windows)。如果您想要不创建窗口的单独控制台,请使用creationflags=CREATE_NO_WINDOW(0x08000000)。在这种情况下,他们仍然有控制台标准I / O;它只是没有渲染到窗口。

答案 1 :(得分:0)

使用asyncio的解决方案:

import asyncio

commands = [
    'python node1.py',
    'python node2.py',
]

async def run_command(command):
    task = await asyncio.create_subprocess_exec(*command.split())
    await task.wait()

combined_task = asyncio.gather(*(run_command(command) for command in commands))
asyncio.get_event_loop().run_until_complete(combined_task)