Gevent和Subprocess问题

news/2025/9/22 13:19:19/文章来源:https://www.cnblogs.com/linagcheng/p/19104985

Gevent和Subprocess问题

1、复现

在main文件中调用gevent、并做了monkey pathch, 然后再调用subprocess.Popen(),出现一直卡住的问题

  • Python 标准库里的很多 IO(网络 socket、ssl、time.sleep 等)都是 阻塞的
    • 调用 socket.recv() 会阻塞整个线程,其他 greenlet 无法运行。
  • 为了让这些阻塞调用 在等待时让出控制权,gevent 需要“接管”标准库里的阻塞函数 → 这就是 monkey patch
from gevent import monkey
monkey.patch_all()import subprocessp = subprocess.Popen("echo 111", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)p.wait()

2、原因

monkey.patch_all() 会对 Python 的标准库做打猴子补丁,其中包括 subprocess。而被打过补丁的 subprocess 在某些情况下(尤其是涉及到 Popencommunicatewait 或交互式命令)会出现 阻塞/卡住 的情况

  • subprocess 被 gevent 补丁后不完全兼容
    gevent 会用协程友好的 IO 替换底层调用,但 subprocess 的管道和底层 select/poll 行为会变得不可预期。
  • 所有 Popencommunicatewait 都是标准阻塞版本,不会和 gevent 的事件循环配合

3、解决方法

以下是两种解决办法, 确认是否需要协程化的子进程

  • 如果只是跑系统命令、不需要协程化,建议用 原生 subprocess,用方法1
  • 如果需要和 gevent 事件循环兼容,再考虑 gevent.subprocess, 用方法2

方法1:不要 monkey patch subprocess
在调用 monkey.patch_all() 时,可以显式排除:

from gevent import monkey
monkey.patch_all(subprocess=False)

 

方法2:使用 gevent.subprocess 代替
如果你确实想在 gevent 下用子进程,可以用:

from gevent import subprocess
p = subprocess.Popen(["cmd", "/c", "echo hello"], stdout=subprocess.PIPE)
out, err = p.communicate()
print(out.decode())

这个是 gevent 提供的封装,适配了它的事件循环。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/909345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF ListBox loaded 76.6M items with imagesource

Install-Package Microsoft.Extensions.DependencyInjection; Install-Package CommunityToolkit.mvvm; public async Task InitDataAsync() {watch.Start();string imgDir = @"../../../Images";if (!Direc…

Ansible自动化运维实战 - 详解

Ansible自动化运维实战 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

建筑行业能源管理破局:MyEMS 打造商业楼宇 “能耗可视化 + 智能调控” 方案

在建筑行业的可持续发展浪潮中,商业楼宇正面临着巨大的能源管理压力。高昂的运营成本、日趋严格的碳排政策以及业主与租户对舒适环境日益增长的需求,共同构成了行业必须面对的挑战。传统的能源管理方式往往依赖于人工…

【数据结构】双向链表 - 指南

【数据结构】双向链表 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

告别“能源糊涂账”:MyEMS如何帮企业把能耗数据“算明白、用到位”

对于许多企业而言,能源成本是运营中一笔不小的开支,但却常常是一笔“糊涂账”。电费账单只有一个总数,只知道“花了多少钱”,却不知道“钱花在了哪里”、“谁在用”、“什么时候用的”、“有没有浪费”。这种粗放式…

完整教程:ElasticSearch倒排索引原理

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Windows 离线环境下使用 VS Code 连接容器 Python 环境完整指南(亲测可用)

前言 在离线服务器环境中进行 Python 开发时,如何利用 VS Code 的强大功能进行调试和开发是一个常见需求。本文将详细介绍如何在 Windows 离线环境下,通过 WSL 和 Docker 容器实现 VS Code 连接 Python 环境的完整方…

Macos 安装kali报错

执行某个安装步骤失败。您可以尝试从菜单中重新运行这个失败的项目, 或跳过它并选择其他项目。失败的步骤是:选择并安装软件 选择语言的时候选择英文就能安装了。不清楚是什么原因

负载排查和分析二

负载排查和分析二明白了,我来帮你做两件事:改进中断部分:完善硬中断、软中断触发机制和它们之间的关联关系,增加图示和说明。优化整个文档美观性:用清晰的表格、层次分明的标题、缩进流程图、代码块高亮,保证可读…

负载排查和分析三

负载排查和分析三明白了,你希望 Step1: 基础统计 能够做到真正的 闭环诊断,即不仅有指标解释,还要告诉用户:可能现象(系统表现或问题)分析工具/命令(如何收集更多数据或验证)分析方法(指标和现象的对应关系、…

完整教程:线程、进程、协程

完整教程:线程、进程、协程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

CF913G Power Substring

推歌:SPOTLIGHT HUNTER 麦晓雯联动出了,没抽到。我爸把我 75 研究卷霍霍露娜上了导致我没法免费保底。诋毁他。 洛谷传送 说回正题。设 \(a\) 有 \(n\) 位,所求的 \(a\) 在 \(2^k\) 中距离末位的位数为 \(m\),显然…

深入解析:老树发新芽:六西格玛培训为石油机械制造注入持久活力

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

YC大佬分享的 10 个 vibe coding技巧,看完收获巨大

1、当 AI 卡住的时候切换战场。 问题: 当你在使用 cursor claude code 这样的 AI 编程工具,在编程的时候,如果遇到 AI 无法实现某个功能或者无法修复某一个错误,并且反复尝试都失败(陷入逻辑死循环) 技巧: 这时…

ES集群部署-EFK架构实战 - 实践

ES集群部署-EFK架构实战 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&quo…

《BOE解忧实验室》第四季圆满收官 以科技重塑文化生活新范式

9月10日,由 BOE(京东方)自制的技术科普综艺节目《BOE解忧实验室》第四季迎来收官,全平台累计曝光量突破4.79亿,成为科技企业破圈营销行业示范标杆。作为中国科技企业首档技术科普综艺,本季节目以“中国地标+科技…

洛谷P2261 [CQOI2007] 余数求和

原题 题目描述 给出正整数\(n\)和\(k\), 请计算 \[G(n, k) = \sum_{i=1}^{n} k \bmod i \]其中\(k \bmod i\)表示k除以i的余数。 输入格式 输入只有一行两个整数,分别表示\(n\)和\(k\)。 输出格式 输出一行一个整数表…

负载排查和优化

负载排查和优化 Linux 网络优化与性能分析完全指南1️⃣ 中断与软中断基础 1.1 中断(IRQ)概念定义:CPU 在执行任务时,外设或内核事件请求 CPU 立即响应。作用:及时处理外设请求和系统事件,保证系统响应及时、稳定…

挑战骑行距离新记录:46公里

挑战骑行距离新记录:46公里周末要去江浦一趟,之前都是坐地铁转公交,这次突发奇想,干脆骑车去,反正时间比较充裕,于是早上8点半左右从住处出发,到中午11点53分到达,全长46公里左右(中间还走错一段路),用时3小…

arc206 总结

arc206 总结 这次前面切得比较快,然而 D 题漏了情况卡到最后也没过。E 题也属于中等难度的题。 A 枚举题目中的 \(L\),一个连续段只能有一个 \(L\),对答案的贡献为其后面不等于 \(a_L\) 的个数。 复杂度 \(O(n)\)。…