代码之家  ›  专栏  ›  技术社区  ›  Brendan Long

在python中生成和等待子进程

  •  6
  • Brendan Long  · 技术社区  · 14 年前

    代码的相关部分如下:

    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,但是我正在用python 2.5测试cygwin,所以可能它在我的机器上失败了,但在linux机器上工作(linux机器非常慢,这个错误很少见,所以我没能在那里得到它)。

    2 回复  |  直到 14 年前
        1
  •  5
  •   Miki Tebeka    14 年前

    推荐的启动子流程的方法是使用 subprocess 模块。

    pipe = Popen(["program", "arg1", "arg2"])
    pipe.wait()
    
        2
  •  3
  •   Alex Martelli    14 年前

    我建议你安装 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()