gpt4 book ai didi

python - 使用文件实现分布式锁

转载 作者:太空狗 更新时间:2023-10-29 18:31:47 27 4
gpt4 key购买 nike

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

比如两台电脑A和B,想同时写入一个ID为123的共享资源。

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

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

我正在尝试用 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)

这行不通,因为可能有多个进程退出等待状态并同时创建锁定文件。

那么,问题又来了:是否可以在共享存储上实现跨机加锁机制?

最佳答案

...有点。

首先,您应该创建一个锁定目录而不是一个锁定文件。如果目录已经存在,创建目录(参见 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)

其次(这就是“某种”的用武之地)您需要某种方式来通知持有锁的人何时死亡。一种简单的方法是让他们偶尔更新锁定目录中的文件。然后,如果客户注意到该文件有一段时间没有更新,他们可以删除该目录并尝试自己获取锁。

关于python - 使用文件实现分布式锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10908077/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com