在 linux 環境下用 Python 進行項目開發過程中經常會遇到多個進程對同一個文件進行讀寫問題,而此時就要對文件進行加鎖控制,在 Python 的 linux 版本下有個 fcntl 模塊可以方便的對文件進行加、解鎖控制。
import fcntl
file_path = "/home/ubuntu/aaa.json"
f = open(file_path, 'w')
fcntl.flock(f.fileno(), fcntl.LOCK_EX) # 加鎖,其它進程對文件操作則不能成功
f.write("something")
fcntl.flock(f.fileno(), fcntl.LOCK_UN) # 解鎖
f.close()
fcntl.flock(f.fileno(), operation) operation 的操作包括以下選項:
-
fcntl.LOCK_EX
排他鎖: 除加鎖進程外其他進程沒有對已加鎖文件讀寫訪問權限
-
fcntl.LOCK_UN
解鎖: 對加鎖文件進行解鎖
-
fcntl.LOCK_SH
共享鎖: 所有進程都沒有寫權限,即使加鎖進程也沒有,但所有進程都有讀權限
-
fcntl.LOCK_NB
非阻塞鎖: 如果指定此參數,函數不能獲得文件鎖就立即返回,否則,函數會等待獲得文件鎖。
LOCK_NB可以同LOCK_SH或LOCK_NB進行按位或(|)運算操作。
fcnt.flock(f.fileno(),fcntl.LOCK_EX|fcntl.LOCK_NB)
