Python:使用子进程流式传输数据而不会出现死锁?

时间:2010-12-05 21:43:00

标签: python subprocess

我正在写一个小脚本来改组大量数据。它是这样的:

outproc = None
for input in input_files:
    p = Popen('process_input "%s" | more_input_processing' %(input, ),
              shell=True, stdout=PIPE)
    for line in p.stdout.xreadlines():
        if linecount % 1000000 == 0:
            outfile = "output%03d" %(linecount // 1000000, )
            if outproc:
                outproc.stdin.close()
                result = outproc.wait() # <-- deadlock here
                assert result == 0, "outproc exited with %s" %(result, )
            outproc = Popen('handle_output "%s"' %(outfile, ),
                            shell=True, stdin=PIPE)
        linecount += 1
        outproc.stdin.write(line)
    p.stdout.close()
    result = p.wait()
    assert result == 0, "p exited with %s" %(result, )

正如文档警告的那样,当我试图等待outproc时,我遇到了僵局(见评论)。

文档提出的“解决方案”是使用.communicate() ...但这样做会涉及在刷新之前将所有输入读入内存,这是不可取的。

那么,如何在没有死锁的子进程之间传输数据?

1 个答案:

答案 0 :(得分:0)

您没有在子进程实际读取的管道上使用close,因此它不会接收SIGPIPE或任何导致它退出的内容。只要有足够的数据,就可以终止进程。或者,管道输入和输出,并使用select来知道何时应该读或写。