当前位置: 首页 > 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.dtcms.com/a/384406.html

相关文章:

  • Scikit-learn 简单介绍入门和常用API汇总
  • [Dify] 用多个工具节点构建多轮 API 调用任务流:链式任务设计实战指南
  • Java实战:从零开发图书管理系统
  • 认知语义学中的隐喻对人工智能自然语言处理的深层语义分析的启示与影响研究报告
  • Mysql数据库事务全解析:概念、操作与隔离级别
  • Halcon 常用算子
  • 基于Spring Boot与Micrometer的系统参数监控指南
  • 【高并发内存池——项目】定长内存池——开胃小菜
  • 作为注册中心zk和nacos如何选型
  • 前置配置3:nacos 配置中心
  • Linux —— 进程的程序替换[进程控制]
  • [Linux] 从YT8531SH出发看Linux网络PHY驱动
  • ArcGIS定向影像(2)——非传统影像轻量级解决方案
  • 分享机械键盘MCU解决方案
  • Unity 性能优化 之 编辑器创建资源优化(UGUI | 物理 | 动画)
  • PostgreSQL——分区表
  • Elastic APM 高级特性:分布式追踪与机器学习优化
  • Ubuntu 服务器配置转发网络访问
  • Redis 数据结构源码剖析(SDS、Dict、Skiplist、Quicklist、Ziplist)
  • C#通讯之网络通讯 TCP UDP
  • 响应时间从5ms到0.8ms:威迈斯AI+DSP协同架构的突破与工程实践
  • 《WINDOWS 环境下32位汇编语言程序设计》第16章 WinSock接口和网络编程(2)
  • 算法--插入排序
  • 领码方案|权限即数据:企业系统中的字段级访问控制架构实战(Ver=1.0)
  • 【面试场景题】支付金融系统与普通业务系统的一些技术和架构上的区别
  • 数证杯顺心借JAVA网站重构详细版(服务器取证基础考点+检材+题目+重构视频)
  • 【Unity】【Photon】Fusion2中的玩家输入系统 学习笔记
  • Vue3 + Three.js 实战:自定义 3D 模型加载与交互全流程
  • 【Leetcode hot 100】102.二叉树的层序遍历
  • [Windows] 微软 .Net 运行库离线安装包 | Microsoft .Net Packages AIO_v09.09.25