如何在linux中的python进程之间锁定目录?

问题描述 投票:5回答:2

我有两个(或更多)python进程在运行,并希望为共享资源创建类似于exclusion mutex的概念。在这种情况下,“共享资源”是一个目录。我最容易/标准地/等等如何实现互斥锁?一个隐藏的.lock文件,每个进程同意检查,如果存在,将其PID附加为新行,然后在有权访问该文件时弹出它们的PID?

我基本上只是想清除一个目录,并确保在我清除它时没有其他进程尝试读取或写入它。

是否有标准的linux方式这样做?也许我可以用python的shell行执行某些操作?

python linux python-3.4
2个回答
1
投票

Linux的

Linux中有两种标准类型的锁定:advisory locking(在POSIX中指定)和mandatory locking(特定于Linux)。

但是,它们都只能应用于文件,而不能应用于目录。所以是的,你需要一个锁文件。它假定所有用户都应该知道锁文件并在访问目录之前获取锁。因此,强制锁定在这里没有帮助,您需要建议锁定。

Linux中有三种咨询文件锁:

  • flock(2)(在POSIX中指定);
  • POSIX记录锁,请参阅fcntl(2)中的“咨询记录锁定”部分以及lockf(3)包装器(均在POSIX中指定);
  • 打开文件描述锁,请参阅fcntl(2)(特定于Linux,在最近的内核中可用)。

蟒蛇

在Python中,flock()lockf()fcntl()函数可通过fcntl模块获得。还有flock模块,它为fcntl.flock函数添加了上下文管理器支持。

这是一个例子:

import flock

with open('/my/dir/lockfile', 'w') as fp:
    with flock.Flock(fp, flock.LOCK_EX) as lock:
        pass # exclusive lock is acquired here

PS。

使用这种方法,如果不了解您的锁文件,则无法阻止随机进程访问您的目录。可能使用支持强制目录锁的FUSE来实现文件系统,但我不知道这样的实现。


0
投票

您可以在目录上应用flock锁。这是建议性的(它不会停止不关心触摸目录的锁的进程)。锁定将一直持续到程序终止。代码非常简单。

lockfd = os.open('.',os.O_RDONLY)
fcntl.flock(lockfd,fcntl.LOCK_EX | fcntl.LOCK_NB)

如果我对该联机帮助页的理解是正确的,您可以通过简单地解锁它。

os.close(lockfd)

但是我没有在我的应用程序中对此进行测试,因此需要锁定以保持脚本的整个运行。

© www.soinside.com 2019 - 2024. All rights reserved.