使用文件实现分布式锁

eli*_*ang 10 python synchronization locking distributed-computing multiprocessing

我有一个网络驱动器(Z:\),由多台Windows计算机共享.是否可以通过简单地在此网络驱动器上创建/删除文件来实现跨机器锁定?

例如,两台计算机A和B希望同时写入ID为123的共享资源.

其中一台计算机,比如A,首先通过创建一个空文件Z:\ locks\123来锁定资源.当B看到存在名为"123"的锁定文件时,B知道其他人正在使用资源123,所以它必须等待Z才能删除Z:\ locks\123才能访问资源.

这就像多线程中的关键部分,但我想在多台机器上完成它.

我正在尝试用Python实现.这是我想出的:

import os
import time


def lock_it(lock_id):

    lock_path = "Z:\\locks\\" + lock_id
    while os.path.exists(lock_path):
        time.sleep(5)  # wait for 5 seconds

    # create the lock file
    lock_file = open(lock_path, "w")
    lock_file.close()


 def unlock_it(lock_id):

     # delete the lock file
     lock_path = "Z:\\locks\\" + lock_id
     if os.path.exists(lock_path):
         os.remove(lock_path)
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为可能有多个进程退出等待状态并同时创建锁定文件.

同样,问题是:是否可以在共享存储上实现跨机器锁定机制?

Dav*_*ver 7

... 有点.

首先,您应该创建一个锁定目录而不是锁定文件.如果目录已存在,则创建目录(请参阅os.mkdir)将失败,因此您可以像这样获取锁:

while True:
    try:
        os.mkdir(r"z:\my_lock")
        return
    except OSError as e:
        if e.errno != 21: # Double check that errno will be the same on Windows
            raise
        time.sleep(5)
Run Code Online (Sandbox Code Playgroud)

第二个(这就是"某种类型"进来的地方)当拿着锁的人死亡时,你会想要某种方式注意.一种简单的方法可能是让它们偶尔更新锁定目录中的文件.然后,如果客户端注意到文件暂时没有更新,他们可以删除该目录并尝试自己获取锁.