【问题标题】:subprocess Popen.process.stdout.readline hangs randomly子进程 Popen.process.stdout.readline 随机挂起
【发布时间】:2020-01-17 14:53:02
【问题描述】:

我正在尝试从 python 启动一个 3rd 方程序并向它发送消息,阅读答案。我不想在每条消息后重新启动 3rd 方程序。

所以我简化了这段代码:

process = subprocess.Popen([executable, "-b", paramValue], 
            stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, bufsize=1)
# clear some startup message, which for some reason is written into stderr
process.stderr.readline()

while 100k+ loops:
    process.stdin.write(txtInputLine)
    resultLine = process.stdout.readline().strip()
    processData(txtInputLine, resultLine)

经过一段随机时间后,通常在循环开始后大约 30 分钟,程序挂起并停止工作。看来 readline() 只是手动并完全停止工作。

如何防止这种情况发生?如果它失败或类似的事情,我不必重新启动该过程(也许使用某种超时?)。

但我什至找不到 readline() 记录在哪里,似乎它只是在子流程文档中提到,没有关于该函数的完整文档,而且谷歌很难避免遇到缺少换行和问题的人的线程和其他阻止 readline 以更具确定性的方式工作的问题。

【问题讨论】:

  • 你正在淹没你电脑的内存......哈哈。你应该创建一个工作示例。想想你的脚本是否应该有守护进程活动。当你从while循环中中断时会发生什么?只是一个print('Done') 或在工作示例中就足够了。对于工人.. 使用 def A(): dosomething 等。
  • .. 另外...您应该从 threading() 或多处理模块中对此进行编码。后者用于独立应用程序,线程在 python GIL 下完成。
  • 我根本没有内存不足,也不需要线程,我所做的只是与一个命令行工具接口,该工具执行一些我需要的计算,特别是子进程是一个 c++ connect 4 求解器,我需要从中解决一些职位。
  • 你是否达到了某种缓冲限制?例如。你给了程序太多的输入,而没有从输出中读取足够的内容(反之亦然)。您是否检查过 STDERR 中没有装满等待清除的垃圾?如果不将 STDERR 发送到 PIPE,看看效果是否更好?

标签: python python-3.x subprocess python-3.7


【解决方案1】:

问题是 stderr 上的一些输出从未被读取并最终阻塞了所有内容。将 stderr 设置为写入 devnull 解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多