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\n"
    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的,對於服務訪問量不大的情況,這樣使用還是比較方便的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM