因此,我想执行一些代码,这些代码必须来自Python中不同的运行程序。为此,我虽然打算使用文件锁。
但是,它不起作用。在下面的代码中,我正在执行的操作是打印一条作为参数给出的消息,然后等待30秒才能解锁该文件。在这种情况下,如果我运行两个实例,则第二个实例必须等待该时间才能打印消息。但这不会发生,因为两个实例都会立即打印该消息。
我在做什么错?
message = sys.argv[1]
lock_file = "test.lock"
_flock = None
def _lock_file():
_flock = open(lock_file, 'w+')
while True:
try:
fcntl.flock(_flock, fcntl.LOCK_EX | fcntl.LOCK_NB)
break
except IOError as e:
# raise on unrelated IOErrors
if e.errno != errno.EAGAIN:
raise
else:
time.sleep(0.1)
def _unlock_file():
if _flock != None:
fcntl.flock(_flock, fcntl.LOCK_UN)
_lock_file()
print(message)
time.sleep(30)
_unlock_file()
对我来说,下面的作品,为什么有while True?
使用lockf代替flock。它可以更好地保护锁的获取和释放。关键区别在于lockf强制锁。这意味着当一个进程锁定文件的某个部分时,其他任何进程都无法访问该文件的该部分。flock另一方面,是建议性锁定-意味着进程必须选择同意锁定文件,但内核不会强制执行此类操作。
import sys
import fcntl
import time
message = sys.argv[1]
lock_file = "test.lock"
_flock = open(lock_file, "w")
def lock_file(f):
fcntl.lockf(f, fcntl.LOCK_EX)
def unlock_file(f):
fcntl.lockf(f, fcntl.LOCK_UN)
lock_file(_flock)
print(message)
time.sleep(30)
unlock_file(_flock)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。