簡體   English   中英

文件鎖未按預期工作

[英]File lock not working as expected

我有一個Thread -extending類,它應該一次只運行一個實例(跨進程)。 為了實現這一點,我正在嘗試使用文件鎖。 以下是我的代碼:

class Scanner(Thread):

  def __init__(self, path):
    Thread.__init__(self)
    self.lock_file = open(os.path.join(config.BASEDIR, "scanner.lock"), 'r+')
    fcntl.lockf(self.lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB)

  # Stuff omitted

  def run(self):
    logging.info("Starting scan on %s" % self.path)

    # More stuff omitted

    fcntl.lockf(self.lock_file, fcntl.LOCK_UN)

如果Scanner線程已經在運行並且根本沒有初始化對象,我期望lockf調用拋出異常。 但是,我可以在終端中看到這個:

INFO:root:Starting scan on /home/felix/Music
INFO:root:Starting scan on /home/felix/Music
INFO:root:Scan finished
INFO:root:Scan finished

這表明兩個Scanner線程同時運行,沒有異常拋出。 我確定我在這里遺漏了一些非常基本的東西,但我似乎無法弄清楚那是什么。 有人可以幫忙嗎?

最后我自己找到了解決方案。 它是使用fcntl.flock()而不是fcntl.lockf() ,使用完全相同的參數。 不知道為什么會有所作為。

您正在使用r+打開鎖定文件,該文件正在刪除上一個文件並創建一個新文件。 每個線程都鎖定一個不同的文件。

使用wr+a

除了使用flock,我還必須像這樣打開文件:

fd = os.open(lockfile, os.O_CREAT | os.O_TRUNC | os.O_WRONLY)

它沒有其他工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM