python编程之IO缓冲

本文详细解析了IO缓冲的工作原理,包括全缓冲、行缓冲及自定义缓冲大小的应用场景,阐述了缓冲机制在文件写入和终端输出中的作用,以及在多线程或多进程环境中避免死锁的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       IO缓冲主要发生在文件写入和终端输出时。

       在文件写入时,比如调用文件对象的write方法进行写入,其并不是直接就写入到电脑磁盘中的,一般是先保存到内存的缓冲区中,最后当关闭文件对象或者程序退出时,才会将缓冲区中的内容冲洗到磁盘中,这种先全部保存在缓冲区中,最后再一下子冲洗到磁盘中的缓冲方式就叫做全缓冲。除了全缓冲,还有行缓冲,顾名思义,就是只要缓冲区中接收到换行符,就会将这行的内容从缓冲区中冲洗到相应的地方,如果是文件写入,则冲洗到磁盘中保存,如果是终端输出,则冲洗到终端显示出来。

       缓冲方式除了全缓冲和行缓冲,还可以指定缓冲大小。比如在文件IO中,创建一个文件对象时,可以通过open函数的buffering参数设定缓冲大小,默认是-1的,如果设为1,表示行缓冲,这个只对文本模式有效;设为0表示没有缓冲,即时写入即时保存到磁盘中,这个只对二进制模式有效;如果大于1,则表示字节数。当为-1时,缓冲的大小是依据系统内存大小来自动启发式设定的,一般情况下为4KB或8KB。所以,实际上文件IO并非默认全缓冲,而是根据系统的实际内存大小来自动启发式设定的,但是如果我们写一个新建文件并不断写入的脚本来测试的话,可以看到,只有当程序结束或者退出时,文件实际大小才显示出来,不然是显示为0的,看起来和全缓冲一样,实际上,底层并非全缓冲。

       值得一提的是,python中,print函数实际上和文件IO类似,当print时,如果是在终端显示的话(默认),实际上是在调用一个sys.stdout.write这么一个函数,sys.stdout可以认为是一个python解释器中的文件类似的对象。如果print函数中设定的文件参数,即是打印到文件中,那么其buffering大小是依据文件对象创建时而定的,如果是默认的终端输出,那么其是行缓冲的,其接收到换行符时才会打印显示到终端。此外,print函数还有一个flush参数,如果设定为True,那么其不会缓冲,会即时的冲洗到文件中或者终端,不论文件对象本身的buffering是多大。

       之所以要知道IO缓冲,是为了理解IO的实际过程,即其并非直接的即时的写入或者打印,而是会经过缓冲这么一个过程,这种细节有时候在多线程或者多进程打印或写入时,对避免死锁具有价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值