python - 等待具有多个并行作业的子进程结束

标签 python subprocess

我正在并行运行来自 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 方法阻塞了我的程序。

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

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

最佳答案

如果您的平台不是 Windows,您可能会针对子进程的标准输出管道进行选择。然后,您的应用将被阻止,直到:

  • 其中一个已注册的文件描述符有一个 I/O 事件(在这种情况下,我们对子进程的标准输出管道上的挂起感兴趣)
  • 投票超时

在 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

关于python - 等待具有多个并行作业的子进程结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3194018/

相关文章:

python - celery 没有找到 python-dateutil,尽管它已安装

python - PLY Lex 和 Yacc 问题

python - 何时对 Python 子进程模块使用 Shell=True

python - 使用多个命令运行子进程并分离到后台保持顺序

python - 使用 xlsxwriter 或 xlwt 更改 python 2.7 中单元格的格式

python - 二进制搜索功能

python - Discord.py 不允许通过 `` ` 的代码块

perl - 在 perl 中关闭多个输出管道而不阻塞每个管道

执行外部程序后可以发送多个输入的Python脚本

python - 如何使用子进程 Popen.communicate() 方法?