【问题标题】:Python code hangs when using a subprocess with a large amout of output to stdout使用具有大量输出到标准输出的子进程时,Python 代码挂起
【发布时间】:2019-04-17 08:53:29
【问题描述】:

我有一个可以将大量数据输出到标准输出的子进程。当生成太多数据时,会导致子进程挂起,因为它正在等待 stdout 缓冲区被清空。

下面是一个小例子……

test.py

#!/usr/local/bin/python2.7

# test.py

import subprocess

proc = subprocess.Popen(["python","./_ping_con.py"], stdout = subp.PIPE)

while proc.poll() is None:
    pass

print proc.stdout.read()

...和子进程:

#!/usr/local/bin/python2.7

# _ping_con.py

print(96000 * "*")   # Hangs here because it's too much data for the stdout pipe

我想知道的是,这个缓冲区是否可以扩展以允许处理更多数据?如果没有,是否可以通过其他方式发送数据来避免此问题?或者在主进程中,有没有办法判断标准输出缓冲区是否已满并进行读取?

【问题讨论】:

  • 这是一个已知的错误:" 注意这将在使用 stdout=PIPE 或 stderr=PIPE 时出现死锁,并且子进程会向管道生成足够的输出,从而阻塞等待 OS 管道缓冲区接受更多数据。使用管道时使用 Popen.communicate() 来避免这种情况。"
  • @rdas,已知,是的。我不确定这是一个 错误 - 它的行为符合设计和记录。

标签: python subprocess stdout


【解决方案1】:

我最终做的是将所有输出写入一个临时文件,然后将文件名传递回父级。效果很好!

【讨论】:

  • 虽然这可能有效,但您实际上并没有解决任何问题。只是掩盖了问题。您应该按照@rdas 评论修复它
  • 如果 Popen.communicate() 在我完成使用之前关闭了 PIPE,它有什么帮助?这就是我在网上查找使用它的简单示例时发现的。我的应用程序不需要通过 PIPE 传递数据。
猜你喜欢
  • 2011-08-29
  • 2018-02-14
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
  • 2018-03-11
相关资源
最近更新 更多