在Python中生成和等待子进程

在Python中生成和等待子进程,python,linux,cygwin,process,Python,Linux,Cygwin,Process,代码的相关部分如下所示: pids = [] for size in SIZES: pids.append(os.spawnv(os.P_NOWAIT, RESIZECMD, [RESIZECMD, lotsOfOptions])) # Wait for all spawned imagemagick processes to finish while pids: (pid, status) = os.waitpid(0, 0) if pid: pid

代码的相关部分如下所示:

pids = [] 
for size in SIZES:
    pids.append(os.spawnv(os.P_NOWAIT, RESIZECMD, [RESIZECMD, lotsOfOptions]))

# Wait for all spawned imagemagick processes to finish
while pids:
    (pid, status) = os.waitpid(0, 0)
    if pid:
        pids.remove(pid)
这应该做的是生成所有进程,然后等待每个进程完成后再继续。它所做的是大部分工作,但有时会在下一部分崩溃(当它期望所有这些过程都完成时)

这有什么问题吗?有更好的方法吗


它必须使用的环境是CentOS和Python2.4,但我正在使用Python2.5在Cygwin上进行测试,因此它可能在我的机器上失败,但在Linux机器上可以工作(Linux机器非常慢,而且这个错误很少见,因此我无法在那里获得它)。然后,在循环中,您将执行以下操作

pids.append(subprocess.Popen([RESIZECMD, lot, of, options])
下面的循环只是一个简单的例子

for pid in pids:
    pid.wait()

建议使用模块启动子流程


subprocess.Popen()
在Python2中运行良好时,我不明白为什么需要安装该模块。4@Brendan,关键的错误修复,特别是对于同时使用子进程和线程的程序——我在给您指出的简短页面中提到过,这是整个第2段。是否有任何理由需要完整的修复列表。。。?EINTR处理,大型FD不再出现问题,FD/手柄不再泄漏…哦,我明白了。我这样问是因为这是一个工作项目,如果我不需要安装任何新的东西,这会容易得多。谢谢。@Brendan,您不必安装固定版本(就像您不必安装软件供应商提供的任何给定错误修复程序一样);如果您没有线程,没有长时间运行的父进程,那么泄漏和大型FD就没有问题,也没有发送到父进程的中断,等等,那么这些bug就不会出现(这就是它们如何存活这么长时间的原因……它们是间歇性的,很难复制,并且只发生在特定类别的用例中!)。
pipe = Popen(["program", "arg1", "arg2"])
pipe.wait()