我找到了一个文件锁定类的演示(这里:https ://groups.google.com/forum/#!topic/pug-pe/mQr7KX-cenU ),但我不太了解使用它的机制。
@contextmanager
def FileLock(lock_file):
if os.path.exists(lock_file):
print 'Only one script can run at once. '\
'Script is locked with %s' % lock_file
sys.exit(-1)
else:
open(lock_file, 'w').write("1")
try:
yield
finally:
os.remove(lock_file)
我相信这会说“如果传入的文件不存在,请打开它。完成后,将其删除。
演示的用途是:
with FileLock('/tmp/my_script.lock'):
print "I am here and I am sleeping for 10 sec..."
time.sleep(10)
它工作正常 - 如果我在看到“我在这里,我正在睡觉 10 秒......”时运行脚本,如果我在那 10 秒内再次运行它,我会看到“一次只能运行一个脚本. 脚本被 /tmp/my_script.lock 锁定”。然而,要使用文件锁,人们通常希望在做某事之前“等到获得锁”。但是,“sys.exit()”似乎阻止了这种情况。似乎我想以某种方式将'with'包装在一个while循环中?就像是:
while fileIsLocked:
with FileLock('/tmp/my_script.lock'): # try to get the lock
print "I am here and I am sleeping for 10 sec..."
time.sleep(10)
但我不明白如何从 FileLock 获取返回值。有人可以解释如何做到这一点吗?