繁体   English   中英

避免在Popen和stdout = PIPE中出现死锁

[英]Avoid Deadlock wtih Popen and stdout = PIPE in python

我正在使用Popen执行Shell脚本。 我也使用stdout = PIPE捕获输出。代码是

pipe = Popen('acbd.sh', shell=True, stdout = PIPE)
while pipe.poll() is None:
        time.sleep(0.5)
text = pipe.communicate()[0]
if pipe.returncode == 0:
    print "File executed"

根据文档,将poll与stdout = PIPE一起使用可能会导致死锁。 还可以使用communication()解决此问题。 我在这里使用了communication()。

我的代码也会导致通讯死锁吗?还是我使用的通讯用法错误?

另外,我在subprocess.check_output中有一个替代项,但我更喜欢使用Popen并用它记录输出。

是的,由于以下两行,您可以陷入僵局:

while pipe.poll() is None:
    time.sleep(0.5)

带他们出去; 这里不需要他们。 communicate()将等待子进程按原样关闭其FD(就像在退出时一样); 当您自己添加一个循环并且直到该循环完成后才进行读取时 ,您的程序可能会无限期地停留在尝试编写内容的过程中,直到communicate()导致管道的另一端开始读取该内容为止。


作为背景: write()调用的POSIX规范不保证在FIFO被阻塞之前可以写入FIFO的数据量,或者即使在给定的系统中 ,该数据量也将保持一致-因此,安全的做法是假定除非有读者主动使用该数据,否则始终允许阻止对FIFO的任何写入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM