使用 Popen.wait() 时重现死锁

2023-12-20

从文档中使用Popen.wait() https://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait may:

使用 stdout=PIPE 和/或 stderr=PIPE 以及子进程时出现死锁 进程向管道生成足够的输出,从而阻止等待 以便操作系统管道缓冲区接受更多数据。使用communicate()来避免 那。

在沟通中docs http://In%20communicate%20docs%20it's%20written%20that:%20The%20data%20read%20is%20buffered%20in%20memory,%20so%20do%20not%20use%20this%20method%20if%20the%20data%20size%20is%20large%20or%20unlimited上面写道:

读取的数据缓冲在内存中,因此如果以下情况请勿使用此方法 数据量很大或无限制

如何重现这种有问题的行为并查看使用Popen.communicate() https://docs.python.org/2/library/subprocess.html#subprocess.Popen.communicate修复它吗?

死锁意味着持有资源的进程之间会发生一些循环等待,并且永远卡住。 这里的循环依赖是什么? Python进程等待子进程终止是一种等待。另一个是什么?在下面的场景中谁在等待什么?

它阻塞等待操作系统管道缓冲区接受更多数据


这很容易。

创建一个输出大量文本的进程don't读取输出:

p = subprocess.Popen(["ls","-R"],stdout=subprocess.PIPE)
p.wait()

一段时间后,标准输出管道已满,进程被阻塞。

这是一种死锁情况,因为子进程在消耗之前无法再向输出写入内容(即:从不),并且 python 进程等待子进程完成。

为了避免死锁,您可以使用读取行循环:

p = subprocess.Popen(["ls","-R"],stdout=subprocess.PIPE)
for line in p.stdout:
    # do something with the line
p.wait()

communicate也修复了这个问题,但也修复了两个输出的更棘手的情况and错误流被重定向到单独的流(在这种情况下,上面的简单循环仍然可能死锁)。

假设你有一个编译过程

p = subprocess.Popen(["gcc","-c"]+mega_list_of_files,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

现在你想获得这个的输出,所以你这样做:

output = p.stdout.read()

不幸的是,当您读取输出流时,会弹出很多错误,从而阻塞错误流:再次死锁。

尝试读取错误流,可能会发生完全相反的情况:大量标准输出输出阻塞您的进程。

communicate使用多线程能够同时处理输出和错误流并将它们分开,没有阻塞的风险。唯一需要注意的是,您无法实时控制逐行处理输出/打印程序输出:

p = subprocess.Popen(["gcc","-c"]+mega_list_of_files,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
output,error = p.communicate()
return_code = p.wait()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Popen.wait() 时重现死锁 的相关文章

随机推荐

  • 如何构建自动更新的拖放层次树

    我目前正在 R 工作 需要一种可视化分层树的方法 我希望能够最初定义一棵树 其中每个节点都有一个父节点 每个父节点可以有多个子节点 我希望能够将节点拖放到不同父级下并执行一些计算 在 R 中 然后在可视化上进行更新 例如假设每个节点都有一个
  • 正则表达式“包含”另一个正则表达式

    有没有办法测试一个正则表达式是否 包含 另一个正则表达式 例如 RegEX1 a b RegEx2 a1 b RegEX1 包含 RegEX2 据我所知 这是不可能的 我错了吗 OK joel neely has shown that it
  • C++ Boost.ASIO async_read_until 慢

    我遇到了一个不寻常的问题 我有一个 C Boost ASIO Web 服务器 为了处理传入请求 我使用以下代码 boost asio async read until socket response r n r n boost bind c
  • 如何使用seaborn制作气泡图

    import matplotlib pyplot as plt import numpy as np data x IEEE Elsevier Others y 7 6 2 import seaborn as sns plt legend
  • Modelica - Dymola Python 界面:将输出格式设置为文本

    我通过 Dymola Python 界面使用 Dymola 运行 Modelica 模拟 我的目标是将结果文件写入文本输出 即写入 txt文件 即使我的模型包含注释 Dymola experimentSetupOutput textual
  • C/C++ 中的单引号、双引号和 sizeof('a')

    我正在看问题C 或 C 中的单引号与双引号 https stackoverflow com questions 3683602 single quotes vs double quotes in c 我无法完全理解给出的解释 所以我写了一个
  • 位运算符优先级

    我在类 C 语言中遇到过几次的问题是 original included excluded BAD 由于优先级 它解析为 original included excluded excluded has no effect 有谁知道三个独立优
  • Git 预提交挂钩在 GitHub for mac 中失败(在命令行上运行)

    我创建了一个非常简单的预提交脚本 usr bin env sh Run tests npm test if ne 0 then echo Tests failed Aborting exit 1 fi exit 0 当我跑步时git com
  • MyBatis - 找不到构造函数

    我在 MyBatis 映射方面遇到问题 我有一个像这样的域类 public class MyClass private Long id private Date create private String content MyClass L
  • Android:键盘与 EditText 重叠(带有打印屏幕)

    我有一个 EditText 用户可以输入numbers在 因此 当用户单击 EditText 文本框时 将打开带有数字的键盘 正如您所看到的 键盘隐藏了文本框的一小部分 But when I press a key for example
  • 有没有办法从boto3获取access_key和secret_key? [复制]

    这个问题在这里已经有答案了 当我启动具有 IAM 角色的 EC2 实例时 我可以使用boto3在该 EC2 实例上 不必指定 aws 访问权限和密钥 因为boto3 自动读取它们 http boto3 readthedocs io en l
  • 如何使容器的子 div 与 IE7 中最大子 div 的宽度相匹配?

    这似乎应该是重复的 我发现了很多类似的问题 但没有一个对我的答案有效 如果我漏掉了一个 请指出 我会删除这个 我有一个绝对定位的 div 包含几个子 div 我希望容器扩展到最宽子级的宽度 并且所有其他子级扩展到相同的宽度 容器应有最小宽度
  • 寻找有关神经网络的良好参考[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 复制 有哪些学习人工神经网络的好资源 https stackoverflow com question
  • 使用 cairo_pdf 设备时的字体间距

    我正在使用 ggtext 并且我注意到有gaps当我使用较小的字体大小时的字体间距 library tidyverse library ggtext ggplot annotate richtext x 0 y 1 label span s
  • 未找到 ID 为“com.google.gms.google-services”的插件

    我第一次在我的应用程序 离子平台 中使用谷歌服务 我正在关注这个doc https developers google com cloud messaging android start 在构建我的应用程序时 我收到以下错误消息 请帮忙 谢
  • 如何在复制过程中过滤数据并只向用户提供他自己的文档?

    我需要在客户端同步来自 CouchDB 和 PouchDB 的服务器数据 每个用户都有自己的数据 当他在线时 该数据正在更新 如何在复制过程中过滤数据并只向用户提供他自己的文档 这对我来说是安全问题 在您开始拥有大量用户 数千个 之前 为每
  • 如何获取(内置)麦克风的硬件信息?

    当用户在我的网站上录制音频文件时 是否可以读取 内置 麦克风的硬件信息 至少是名称 JavaScript 可以做到这一点吗 或者有其他方法可以解决这个问题吗 我在网上搜索但只能找到用 JavaScript 录制的脚本 新版本 可在 Fire
  • 如何使用 C# 确定屏幕宽度/高度

    我想设置a的宽度和高度Window动态地基于用户屏幕的最大宽度 高度 我如何以编程方式确定这一点 对于主屏幕 System Windows SystemParameters PrimaryScreenWidth System Windows
  • 如何从单个 uitableViewcell 获取多个按钮?

    我正在做一个测验tableView有 4 个按钮 选项 我将它们标记在故事板上 例如 201 202 203 204 并成功地将它们全部放入tableView方法 但是将目标添加到按钮后 我无法在其中获取特定按钮buttonClicked
  • 使用 Popen.wait() 时重现死锁

    从文档中使用Popen wait https docs python org 2 library subprocess html subprocess Popen wait may 使用 stdout PIPE 和 或 stderr PIP