【问题标题】:waiting for multiple Python processes to finish in Windows 7 CMD等待多个 Python 进程在 Windows 7 CMD 中完成
【发布时间】:2018-01-05 10:59:07
【问题描述】:

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

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

这是我正在尝试运行的 CMD 命令。

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

有什么建议吗?

【问题讨论】:

  • 嗨,你能说得清楚一点吗?发现难以理解。到目前为止,您正在尝试从主脚本并行运行三个程序,并且主脚本包含程序编辑的内容。我说的对吗?
  • 你是。主脚本使用上述示例运行 3 个不同的任务。在继续其他任务之前,它需要等待它们全部完成。因为我不想让程序在估计的时间内休眠,所以我需要它等待所有进程完成。
  • 嗯...您的最后一个脚本“printstatement.py”是否依赖于前三个的结果?除了并行运行三个脚本之外,您的主脚本还有其他事情要做吗?您是否尝试过“多处理”来并行化整个过程?
  • 我确实尝试过。由于每个脚本有多个不同的 I\O 参数,因此存在问题。
  • @eryksun 你能提供一个subprocess.Popen 的例子吗?可以用多个脚本替换os.system 来运行?

标签: python windows cmd parallel-processing


【解决方案1】:

使用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;它只是没有渲染到窗口。

【讨论】:

  • 再次完美运行。窗户实际上真的很烦人,所以摆脱它们是一种祝福
  • 这样做真的很好!
  • 不错的惯用技巧
【解决方案2】:

使用 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2015-05-27
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多