我使用这个 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 将其输出刷新到标准输出,(尽管如果我手动尝试p1.stdout.flush()
,有时也会得到 IOError)。
我不能使用communicate(),因为p2 的输出非常大,我想在executable_2
仍在执行时处理数据。
在这种情况下,如何在不使用 sleep() 的情况下防止死锁?