我正在尝试为在集群上运行的软件实现基于文件系统的锁。基础共享文件系统是使用DRBD实现的,因此可以认为可以保证同步性。我当前的实现如下所示:
# check the lock file
if os.path.isfile(lockfile):
if time.time() - os.path.getmtime(lockfile) > 3600:
logInfo('lock is older than 3600s, removing it and going on collecting result.')
os.remove(lockfile)
else:
logInfo('Previous action is still on-going, please wait until it\'s finished or timeout.')
sys.exit(1)
# create the lock file
open(lockfile, 'w').close();
显然,当在群集中不同计算机上运行的脚本的多个实例可能一致认为系统已解锁,创建锁文件并执行需要相互排斥的操作时,可能会发生这种情况。
综上所述,我需要一个基于文件系统的锁定工具,并且锁定检查和创建共同构成了一个原子操作。
使用lockfile命令可以在Shell脚本中实现相同的功能。
可以通过使用os.open来实现解决方案,它包装了open
系统调用:
import os,errno
def lockfile(filename):
try:
os.close(os.open(filename, os.O_CREAT | os.O_EXCL | os.O_WRONLY));
except OSError as e:
if e.errno == errno.EEXIST: # System is already locked as the file already exists.
return False
else: # Something unexpected went wrong so reraise the exception.
raise
return True # System has successfully been locked by the function
注意os.open()的第二个参数。根据此答案,当将标志O_EXCL与O_CREAT结合使用且路径名已存在时,则open()将失败,或更确切地说,将使用errno EEXIST引发OSError,这在我们的情况下意味着系统为已经锁定。但是,当路径指向不存在的文件时,将立即创建该路径,而不会为文件系统的其他用户同时执行相同的步骤留出时间范围。并且根据这一点,可以认为所描述的技术在很大程度上与平台无关。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句