• Python 使用flush函数将缓冲区数据立即写磁盘


    1 问题

    在后台领域,经常用python做一些简单服务,实现起来速度较快、变化较灵活,相比C++,成本要低很多。作为后台服务,在观察服务运行情况时,都希望服务能够实时输出日志数据,以便观察。之前我用python写的一个服务,发现就没有实时把数据写到磁盘,导致在观察数据时,发现实际上某个行为已经执行成功了,但日志并未有记录。

    2 原因分析及解决

    示例代码:

    #!/usr/bin/env python
    # -*- coding: gbk -*-
    
    import time
    
    fd = open("a.txt", "a")
    i = 0
    while 1:
    
        buf = "a
    "
        fd.write(buf)
        time.sleep(1)
        i = i + 1
    
        if i > 10:
            break
    
    fd.close()

    代码的功能很简单,每一秒把“a”写入文件a.txt中。在运行中,发现在运行10秒后,文件a.txt才会真正完成数据的写入。原因是很简单,python的实现中,调用write后,只是把数据写到内核缓冲区,实际上并没有把数据写到磁盘上,只有调用close或是内核缓冲区满的情况下,数据才会写入磁盘中。

    我们抽象一下来看,对于我们的服务来说,我们通常会这样写代码:

    #!/usr/bin/env python
    # -*- coding: gbk -*-
    
    import time
    
    i = 0
    while 1:
    
        # 干活
        do_something()
    
        # 刷新缓冲区,把数据写到磁盘上,fd为打开的文件句柄,假设你在系统已经打开了
        fd.flush()

    对于我们来说,服务每次do_something,我们都希望实时观察到输出。调用flush函数,在每次循环后,都可以把数据输出到磁盘,这样便可实时观察到日志输出。

    当然,频繁使用这个函数,要考虑性能问题,系统频繁的将数据写到磁盘,是比较耗CPU的,对于服务访问量不大的情况,这样使用还是比较方便的。

  • 相关阅读:
    css 超出两行省略号,超出一行省略号
    css 去掉i标签默认斜体样式
    Spring 使用单选按钮
    Spring Maven工程引入css,js
    Sping 补充完成修改功能
    Spring 控制器层如何启用验证?
    Spring 控制器层如何调用DAO层
    spring boot工程如何启用 热启动功能
    Spring 视图层如何显示验证消息提示
    Sping POJO中如何添加验证规则和验证消息提示
  • 原文地址:https://www.cnblogs.com/derrick/p/4067660.html
Copyright © 2020-2023  润新知