在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)
这个代码的目的是要启动所有的进程,然后在继续之前等每个进程都完成。大部分情况下它是能正常工作的,但有时候在下一部分时会崩溃(当它期待所有进程都完成时)。
这段代码有什么问题吗?有没有更好的方法来实现这个功能?
它需要在CentOS上运行,使用的是Python 2.4,但我在Cygwin上测试的是Python 2.5,所以可能在我的机器上出错,但在Linux上能正常工作(Linux机器很慢,这个错误很少见,所以我还没能在上面复现)。
2 个回答
3
我建议你安装一下 python-subprocess32,这是一个很强大的工具,它把Python 3中的 subprocess
模块的功能移植到了Python 2.4到2.7版本上。对于在Python 2中运行子进程来说,这是最好的选择。然后,在你的循环中,你可以这样做:
pids.append(subprocess.Popen([RESIZECMD, lot, of, options])
接下来的循环就会变得很简单:
for pid in pids:
pid.wait()
5
开始一个子进程的推荐方法是使用 subprocess 模块。
pipe = Popen(["program", "arg1", "arg2"])
pipe.wait()