我有两个(或更多)
python进程在运行,并且想要为共享资源创建类似于
exclusion mutex的概念.在这种情况下,“共享资源”是一个目录.我最容易/标准地/等等如何实现互斥锁?每个进程同意检查的隐藏.lock文件,如果存在,则将其PID作为新行附加,然后在有权访问该文件时弹出它们的PID?
我基本上只是想清除一个目录,并确保在我清除它时没有其他进程尝试读取或写入它.
是否有标准的linux方式这样做?也许我可以用python的shell行执行某些操作?
解决方法
Linux的
Linux中有两种标准类型的锁定:advisory locking(在POSIX中指定)和mandatory locking(特定于Linux).
但是,它们都只能应用于文件,而不能应用于目录.所以是的,你需要一个锁文件.它假定所有用户都应该知道锁文件并在访问目录之前获取锁.因此,强制锁定在这里没有帮助,您需要建议锁定.
Linux中有三种咨询文件锁:
> flock(2)
(在POSIX中指定);
> POSIX记录锁,请参阅fcntl(2)
中的“咨询记录锁定”部分以及lockf(3)
包装器(均在POSIX中指定);
>打开文件描述锁,请参阅fcntl(2)
(特定于Linux,在最近的内核中可用).
Python
在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实现文件系统,但我不知道这样的实现.