当前位置: 首页 > news >正文

深入解析:Python的输出缓冲区机制

在非交互模式下执行python脚本的时候,会遇到“显示卡顿”的情况,执行过程不能够实时显示到屏幕上,也就不能实时监测执行的情况。

想到了这应该是缓冲区设置的问题,因为它既没有等到程序完全执行完才一次性输出,也没有实时输出,是没有规律地显示出来。

1.shell脚本是凭借echo命令建立,遇到换行符\n就会刷新缓冲区,将内容输出

2.python在交互模式下同shell相同,但是在非交互模式下.py,默认采用的是“块缓冲”模式,也就说当想要输出的内容会先存放到缓冲区,等到缓冲区满了,亦或是过程中有flush()执行,或者工具结束了,才会输出

解决方案

1.给print函数加默认参数print('python',flush=True)

2.执行python脚本的时候,添加参数-u,禁用缓冲python -u test.py

3.设置环境变量,全局禁用缓冲PYTHONUNBUFFERED=1

或者通过shell脚本拉起python的时候,设置环境变量,该脚本对应的执行的python就不会采用缓冲

python默认为“块缓冲”理由:

核心原因时“效率优先”,计算机在向终端、文件输出内容的I\O操作的成本远高于内存的数据处理,如果python实时刷新的话,那么每输出一行,计算机就要向外设发送一次I\O请求,而块缓冲会大大降低I\O的次数,提升效率。

同时,计算机中,应用程序(比如 Python 脚本)不能直接操作外设,必须通过 “系统调用”(比如write()函数)让内核介入 —— 这个过程会发生 “用户态→内核态” 的切换,切换本身就有固定的性能成本(比如保存上下文、权限校验等)。

另外,很多外设(比如磁盘、网络接口)本身就对 “大块连续数据” 的处理效率更高。

http://www.zskr.cn/news/6974.html

相关文章:

  • 解题报告-P11671 [USACO25JAN] Farmer Johns Favorite Operation S
  • 93. 递归实现组合型枚举
  • 9.17支配对问题专题总结
  • Xじゃないか
  • XXL-JOB(2)
  • AT_agc058_b [AGC058B] Adjacent Chmax
  • 2025.9.17
  • mysql库缺失
  • 【学习笔记】拉格朗日插值
  • 一种基于动作指令交互的动态活体检测技术,提升人脸识别安全性
  • 网易伏羲:当算法遇见社交,解码游戏世界的连接密码
  • 在 CentOS 7 上安装Nginx和配置http代理
  • 在AI技术快速实现创想的时代,挖掘新需求成为核心竞争力——某知名DevOps学习平台需求洞察
  • C语言基础
  • 深入 RocketMQ 核心源码:从环境搭建到高可用设计的全方位解析
  • 25上第一周
  • 梯度下降算法
  • 车牌识别
  • 告别人工标注瓶颈!Reward-RAG:用 CriticGPT 打造更懂人类偏好的检索模型
  • 9.17 CSP-S模拟23/多校A层冲刺NOIP2024模拟赛19 改题记录
  • 在AI技术快速实现创想的时代,挖掘前端学习新需求成为关键——某知名编程教育平台需求洞察
  • UML 5章
  • kylin SP3安装mysql 8.4.5
  • Unity中是否可以禁用GC
  • 开源软件图形库
  • 使用GitHub Dork快速发现漏洞:我的第一个Bugcrowd漏洞挖掘实战
  • 代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素、209.长度最小的子数组
  • 从 MLPerf Storage v2.0 看 AI 训练中的存储性能与扩展能力
  • Revit二次开发 钢筋生成API(二)
  • Uri uri = new Uri(Path); 这行代码的作用