我有一个由多台Windows计算机共享的网络驱动器(Z:\)。是否可以通过在此网络驱动器上创建/删除文件来实现跨机器锁?
例如,两台计算机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)
这不起作用,因为可能有多个进程退出等待状态并同时创建锁定文件。
再次,问题是:是否可以在共享存储上实现跨机器锁定机制?
答案 0 :(得分:6)
......有点。
首先,您应该创建一个锁定目录而不是锁定文件。如果目录已存在,则创建目录(请参阅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)
第二个(这就是“某种”进来的地方)当拿着锁的人死亡时,你会想要某种方式注意。一种简单的方法可能是让它们偶尔更新锁定目录中的文件。然后,如果客户端注意到文件暂时没有更新,他们可以删除目录并尝试自己获取锁。
答案 1 :(得分:2)
这不会像你希望的那样有效。您将遇到其他问题,例如网络驱动器即将消失,在这种情况下,您的所有进程都会被卡住或者认为没有人持有锁定。
我建议你研究ZooKeeper之类的东西。您将能够在网络出现故障时创建同步锁并进行恢复。分布式锁后面的框架比在网络驱动器上创建文件要复杂得多。