【问题标题】:How do I run multiple subprocesses in parallel and wait for them to finish in Python如何并行运行多个子进程并等待它们在 Python 中完成
【发布时间】:2015-08-21 13:41:52
【问题描述】:

我正在尝试将 bash 脚本迁移到 Python。

bash 脚本并行运行多个操作系统命令,然后等待它们完成后再恢复,即:

command1 &

command2 &

.

命令&

等待

命令

我想使用 Python 子进程实现相同的目的。这可能吗?如何在恢复之前等待 subprocess.call 命令完成?

【问题讨论】:

标签: python multiprocessing


【解决方案1】:

您仍然可以使用Popen,它采用与subprocess.call 相同的输入参数,但更灵活。

subprocess.call:完整的函数签名与 Popen 构造函数的签名相同 - 此函数将所有提供的参数直接传递到该接口。

一个区别是subprocess.call 阻塞并等待子进程完成(它建立在Popen 之上),而Popen 不会阻塞,因此允许您并行启动其他进程。

尝试以下方法:

from subprocess import Popen
commands = ['command1', 'command2']
procs = [ Popen(i) for i in commands ]
for p in procs:
   p.wait()

【讨论】:

  • 在您的代码中,command1 和 command2 会同时执行吗?还是在 command1 完成后启动 command2?
  • 我测试过,它们是并行运行的。如果要捕获子进程的 stdout/sterr 而不是让它们与父进程的 stdout/stderr 聚集在一起,则可以将 .wait() 替换为 .communicate() 并将参数 stdout=subprocess.PIPEstderr=subprocess.PIPE 添加到 Popen()跨度>
  • 它们确实并行运行,因为子进程在 Popen 返回时启动。但是他们在 wait() 处阻塞。所以这段代码的作用是,在第一个 wait() 的 procs 和块数组中循环一次,直到它结束。如果子进程仍在运行,则在下一个 wait() 处阻塞。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多