2010-06-07 119 views
6

的代码的相关部分看起来是这样的:产卵,并在Python等待子进程

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) 

什么这应该做的是产卵所有进程的关闭,然后等待每个进程在继续前完成。它所做的大部分工作,但有时会在下一部分崩溃(当它期望所有这些过程完成时)。

这是否有问题?有没有更好的方法来做到这一点?

它必须使用的环境是Python 2.4的CentOS,但是我正在用Python 2.5测试Cygwin,所以它可能会在我的机器上失败,但可以在Linux上工作(Linux机器是非常缓慢,这个错误很罕见,所以我一直无法得到它)。

回答

5

推荐的方式来启动子是使用subprocess模块。

pipe = Popen(["program", "arg1", "arg2"]) 
pipe.wait() 
3

我建议您安装python-subprocess32 - Python 3的subprocess标准库模块的一个强大的backport,适用于Python 2.4到2.7,并且是迄今为止在Python 2中运行子进程的最佳方式。然后,在循环中,您会做

pids.append(subprocess.Popen([RESIZECMD, lot, of, options]) 

和下面的循环将只是一个简单的

for pid in pids: 
    pid.wait() 
+0

我很困惑,为什么我会需要安装模块时'subprocess.Popen()'在Python 2.4 – 2010-06-07 23:50:35

+0

@Brendan,关键bug修复工作正常,电除尘器。对于同时使用子进程和线程的程序 - 在我指出的简短页面中提到,它是整个第二段。你有什么理由需要完整的修复列表......? EINTR处理,没有更大的FD问题,没有更多的FD /手柄泄漏... – 2010-06-08 00:40:23

+0

哦,我明白了。我问,因为这是一个工作项目,如果我不需要安装任何新的东西,它会容易得多。谢谢。 – 2010-06-08 00:47:27