等待具有多个并行作业的子流程结束

问题描述 投票:12回答:4

我正在从python并行运行一些子进程。我想等到每个子过程完成。我正在做一个非优雅的解决方案:

runcodes = ["script1.C", "script2.C"]
ps = []
for script in runcodes:
  args = ["root", "-l", "-q", script]
  p = subprocess.Popen(args)
  ps.append(p)
while True:
  ps_status = [p.poll() for p in ps]
  if all([x is not None for x in ps_status]):
    break

是否有可以处理多个子流程的类?问题是wait方法阻止了我的程序。

update:我想显示计算过程中的进度:类似“ 4/7子过程完成...”

如果您好奇root编译c ++脚本并执行它。

python subprocess
4个回答
9
投票

您可以执行以下操作:

runcodes = ["script1.C", "script2.C"]

ps = []
for script in runcodes:
    args = ["root", "-l", "-q", script]
    p = subprocess.Popen(args)
    ps.append(p)

for p in ps:
    p.wait()

这些进程将并行运行,最后您将等待所有这些进程。


9
投票

如果您的平台不是Windows,则可以选择子流程的stdout管道。然后,您的应用将被阻止,直到:

  • 其中一个注册文件描述符具有I / O事件(在这种情况下,我们对子进程的stdout管道上的挂起感兴趣)
  • 民意测验超时
  • 未在Linux 2.6.xx上使用epoll的示例:

import subprocess
import select

poller = select.epoll()
subprocs = {} #map stdout pipe's file descriptor to the Popen object

#spawn some processes
for i in xrange(5):
    subproc = subprocess.Popen(["mylongrunningproc"], stdout=subprocess.PIPE)
    subprocs[subproc.stdout.fileno()] = subproc
    poller.register(subproc.stdout, select.EPOLLHUP)

#loop that polls until completion
while True:
    for fd, flags in poller.poll(timeout=1): #never more than a second without a UI update
        done_proc = subprocs[fd]
        poller.unregister(fd)
        print "this proc is done! blah blah blah"
        ...  #do whatever
    #print a reassuring spinning progress widget
    ...
    #don't forget to break when all are done

7
投票

怎么样


0
投票

我认为答案不是python代码或语言功能,而是系统功能,请考虑以下解决方案:

© www.soinside.com 2019 - 2024. All rights reserved.