首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用文件实现分布式锁

使用文件实现分布式锁
EN

Stack Overflow用户
提问于 2012-06-06 04:13:08
回答 2查看 1.9K关注 0票数 11

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

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

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

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

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

代码语言:javascript
复制
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)

这将无法工作,因为可能有多个进程退出等待状态并同时创建锁文件。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-06 04:17:41

..。说大也大吧。

首先,您应该创建一个锁目录,而不是一个锁文件。如果目录已经存在,创建目录(请参阅os.mkdir)将失败,因此您可以获得如下所示的锁:

代码语言:javascript
复制
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)

第二(这就是“某种”出现的地方),你会想要某种方式来注意持有锁的人什么时候死了。一个简单的方法可能是让他们偶尔更新锁目录中的一个文件。然后,如果客户端注意到该文件有一段时间没有更新,他们可以删除目录并尝试获取锁本身。

票数 8
EN

Stack Overflow用户

发布于 2012-06-06 04:26:51

这不会像你所希望的那样起作用。您还会遇到其他问题,例如网络驱动器即将关闭,在这种情况下,您的所有进程要么会被卡住,要么会认为没有人持有锁。

我建议你研究一下像ZooKeeper这样的东西。您将能够在发生网络故障时创建同步锁并进行恢复。分布式锁背后的框架比在网络驱动器上创建文件要复杂得多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10908077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档