我有两个(或更多)正在运行的python进程,希望为共享资源创建一个类似于exclusion mutex的概念。本例中的“共享资源”是一个目录。我怎样才能最容易/标准地/等实现互斥?每个进程都同意检查的隐藏.lock文件,如果存在,则将其PID附加为新行,然后在它们有权访问该文件时弹出其PID?
我基本上只是想清除一个目录,并确保在我清除它时没有其他进程试图对它进行读写。
有没有一种标准的linux方法可以做到这一点?也许我可以用python中的shell命令行来执行?
发布于 2015-09-18 19:30:31
Linux
在Linux中有两种标准的锁类型:advisory locking (在POSIX中指定)和mandatory locking (特定于Linux)。
但是,这两种方法只能应用于文件,而不能应用于目录。所以,是的,你需要一个锁文件。它假设所有用户都应该知道锁文件,并在访问目录之前获取锁。因此,强制锁定在这里没有帮助,您需要建议锁定。
Linux中有三种建议文件锁:
flock(2) (在POSIX中指定);fcntl(2)中的“建议记录锁定”部分以及lockf(3)包装器(两者都在POSIX中指定);fcntl(2) (特定于Linux,在最近的内核中可用)。Python
在Python中,通过fcntl模块可以使用flock()、lockf()和fcntl()函数。还有一个向fcntl.flock函数添加上下文管理器支持的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 herePS.
使用这种方法,如果随机进程不知道您的锁文件,您就不能阻止它访问您的目录。使用FUSE实现支持强制目录锁的文件系统可能是可能的,但我不知道这样的实现。
发布于 2019-03-06 05:07:56
您可以在目录上应用群集。这是建议性的(它不会停止那些不关心锁接触目录的进程)。该锁将一直存在,直到程序终止。代码非常简单。
lockfd = os.open('.',os.O_RDONLY)
fcntl.flock(lockfd,fcntl.LOCK_EX | fcntl.LOCK_NB)如果我对手册页的理解是正确的,你可以通过简单的操作来解锁它。
os.close(lockfd)但我还没有测试过这一点,因为在我的应用程序中,希望锁在整个脚本运行期间都保持不变。
https://stackoverflow.com/questions/32592698
复制相似问题