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