文件鎖fcntl

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、注意點

  1. 對於文件的 close() 操做會使文件鎖失效;
  2. 同理,進程結束後文件鎖失效;
  3. flock() 的 LOCK_EX是「勸告鎖」,系統內核不會強制檢查鎖的狀態,須要在代碼中進行文件操做的地方顯式檢查才能生效。
  4. 在給文件加鎖以前,必定要保證文件以相應的訪問模式打開,例如:
    要對一個文件加上共享鎖,必定要首先按讀模式打開文件;
    若要給文件加上排他鎖,則首先要按寫模式打開對應文件;
    若想加兩種鎖,則須要按讀寫模式打開.

 

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
相關文章
相關標籤/搜索