Python寫文件時加鎖,避免寫入過程中被讀取
問題:
Linux上有個Python2腳本每天定時生成一些數據,并覆蓋寫入文件A,文件內容是每行一個Json字符串。
有一個乙方的采集器程序(類似filebeat)需要讀取文件A,但發現讀取的數據有截斷,導致解析失敗。
懷疑是因為采集器讀取文件A的時候,文件A寫入還未結束。
解決:
由于采集器程序是乙方自研的,屬于黑箱。想著調整下Python腳本,具體方法就是增加排它鎖。
在linux下,python的標準庫有現成的文件鎖,來自于fcntl模塊。這個模塊提供了unix系統fcntl()和ioctl()的接口。
對于文件鎖的操作,主要需要使用 fcntl.flock(fd, operation)這個函數。
其中,參數 fd 表示文件描述符;參數 operation 指定要進行的鎖操作,該參數的取值有如下幾種:
- LOCK_SH:表示要創建一個共享鎖,在任意時間內,一個文件的共享鎖可以被多個進程擁有
- LOCK_EX:表示創建一個排他鎖,在任意時間內,一個文件的排他鎖只能被一個進程擁有
- LOCK_UN:表示刪除該進程創建的鎖
- LOCK_MAND:它主要是用于共享模式強制鎖,它可以與 LOCK_READ 或者 LOCK_WRITE聯合起來使用,從而表示是否允許并發的讀操作或者并發的寫操作
# coding: utf-8
# for python 2.x
from __future__ import unicode_literals
import codecs
import fcntl
import json
import io
# generate json_list
json_list = [{},{},{},{},{}]
with io.open("/path/to/filename", 'w+', encoding="utf8") as f:
fcntl.flock(f.fileno(), fcntl.LOCK_EX) # 加排它鎖
for i in json_list:
f.write(json.dumps(i, ensure_ascii=False) + "\n")
# 在with塊外,文件關閉,自動解鎖

浙公網安備 33010602011771號