使用Popen避免死锁而不使用sleep(Python 2.7)

时间:2013-05-21 14:52:25

标签: python-2.7 subprocess deadlock

我遇到了使用这个解析生成的输出的Python脚本的死锁问题 管道两个程序并将结果存储在目录x。

import subprocess as sp
from time import sleep

p1 = sp.Popen(['executable_1'], stdout=sp.PIPE , stderr = sp.STDOUT)
p2 = sp.Popen(['executable_2'], stdin=p1.stdout, stdout = sp.PIPE)

x = my_parser(p2.stdout)

但是,如果我使用p2 = sp.Popen(executable_2, stdin=p1.stdout, stdout = sp.PIPE, preexec_fn = time.sleep(0.1))更改脚本,一切似乎都正常。

虽然解决方案对我来说似乎不太干净。我知道等待一段时间我可以让p1将其输出刷新到stdout,(尽管如果我手动尝试p1.stdout.flush()我有时也会得到IOError。)

我不能使用communic(),因为p2的输出非常大,我想在executable_2仍在执行时处理数据。

如何在不使用sleep()的情况下防止死锁?

0 个答案:

没有答案