开发者社区> 问答> 正文

原子访问的文件锁定不起作用

因此,我想执行一些代码,这些代码必须来自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()

展开
收起
祖安文状元 2020-01-08 15:22:04 524 0
1 条回答
写回答
取消 提交回答
  • 对我来说,下面的作品,为什么有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)
    
    2020-01-08 15:22:12
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
事务、全局索引、透明分布式 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多