在Python中创建与等待子进程

7 投票
2 回答
5966 浏览
提问于 2025-04-15 23:40

代码的相关部分看起来是这样的:

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()

撰写回答