1、python中的文件鎖
咱們在寫python應用的時候,當涉及到多個進程向同一個文件write(或者read)的狀況,若是幾個進程同時都對這個文件進行寫操做,那麼文件的內容就會變得很是混亂,這個時候文件鎖就派上用場了。python
python中的文件鎖,能夠保證同時只有一個進程寫文件,目前使用的是fcntl這個庫,它實際上爲 Unix上的ioctl,flock和fcntl 函數提供了一個接口。python經過調用fcntl.flock()函數對文件加鎖。併發
fcntl這個模塊是Python自帶的,但Windows沒有,能夠手工下載fcntl.py文件,而後保存到python的Lib目錄下。函數
2、鎖類型
- LOCK_SH: 表示要建立一個共享鎖,在任意時間內,一個文件的共享鎖能夠被多個進程擁有
- LOCK_EX: 表示建立一個排他鎖,在任意時間內,一個文件的排他鎖只能被一個進程擁有
- LOCK_UN: 表示刪除該進程建立的鎖(解鎖)
- LOCK_MAND:它主要是用於共享模式強制鎖,它能夠與 LOCK_READ 或者 LOCK_WRITE 聯合起來使用,從而 表示是否容許併發的讀操做或者併發的寫操做(儘管在 flock() 的手冊頁中沒有介紹 LOCK_MAND,可是閱讀內核源代碼就會發現,這在內核中已經實現了)
- LOCK_NB: 若是指定此參數,函數不能得到文件鎖就當即返回,不然,函數會等待得到文件鎖。LOCK_NB能夠同LOCK_SH或LOCK_EX進行按位或(|)運算操做。
例如:一個文件設置了排它鎖,若是這個鎖已經被某個進程獲取了,那麼其餘進程請求獲取這個鎖的時候將會被阻塞。
若是想要在沒有得到這個排他鎖的狀況下不阻塞那些進程,能夠與 LOCK_NB 聯合使用,那麼系統就不會阻塞該進程。即: fcnt.flock(f,fcntl.LOCK_EX|fcntl.LOCK_NB)spa
3、注意點
- 對於文件的 close() 操做會使文件鎖失效;
- 同理,進程結束後文件鎖失效;
- flock() 的 LOCK_EX是「勸告鎖」,系統內核不會強制檢查鎖的狀態,須要在代碼中進行文件操做的地方顯式檢查才能生效。
- 在給文件加鎖以前,必定要保證文件以相應的訪問模式打開,例如:
要對一個文件加上共享鎖,必定要首先按讀模式打開文件;
若要給文件加上排他鎖,則首先要按寫模式打開對應文件;
若想加兩種鎖,則須要按讀寫模式打開.
4、示例
import fcntl class Lock(object): def __init__(self, file_name): self.file_name = file_name self.handle = open(file_name, 'w+') def lock(self): fcntl.flock(self.handle, fcntl.LOCK_EX | fcntl.LOCK_NB) def unlock(self): fcntl.flock(self.handle, fcntl.LOCK_UN) def __del__(self): try: self.handle.close() except: pass