我有两个(或更多)python进程在运行,并希望为共享资源创建类似于exclusion mutex的概念。在这种情况下,“共享资源”是一个目录。我最容易/标准地/等等如何实现互斥锁?一个隐藏的.lock
文件,每个进程同意检查,如果存在,将其PID附加为新行,然后在有权访问该文件时弹出它们的PID?
我基本上只是想清除一个目录,并确保在我清除它时没有其他进程尝试读取或写入它。
是否有标准的linux方式这样做?也许我可以用python的shell行执行某些操作?
Linux的
Linux中有两种标准类型的锁定:advisory locking(在POSIX中指定)和mandatory locking(特定于Linux)。
但是,它们都只能应用于文件,而不能应用于目录。所以是的,你需要一个锁文件。它假定所有用户都应该知道锁文件并在访问目录之前获取锁。因此,强制锁定在这里没有帮助,您需要建议锁定。
Linux中有三种咨询文件锁:
flock(2)
(在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来实现文件系统,但我不知道这样的实现。
您可以在目录上应用flock锁。这是建议性的(它不会停止不关心触摸目录的锁的进程)。锁定将一直持续到程序终止。代码非常简单。
lockfd = os.open('.',os.O_RDONLY)
fcntl.flock(lockfd,fcntl.LOCK_EX | fcntl.LOCK_NB)
如果我对该联机帮助页的理解是正确的,您可以通过简单地解锁它。
os.close(lockfd)
但是我没有在我的应用程序中对此进行测试,因此需要锁定以保持脚本的整个运行。