[英]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.