tar*_*yte 5 python linux python-3.4
我有两个(或更多)python进程在运行,并且想要创建一个类似于共享资源的排除互斥锁的概念.在这种情况下,"共享资源"是一个目录.我最容易/标准地/等等如何实现互斥锁?.lock每个进程同意检查的隐藏文件,如果存在,则将其PID附加为新行,然后在有权访问该文件时弹出其PID?
我基本上只是想清除一个目录,并确保在我清除它时没有其他进程尝试读取或写入它.
是否有标准的linux方式这样做?也许我可以用python的shell行执行某些操作?
Linux
Linux 中有两种标准的锁定类型:咨询锁定(POSIX 中指定)和强制锁定(Linux 特定)。
然而,它们都只能应用于文件,而不应用于目录。所以是的,你需要一个锁定文件。它假设所有用户都应该知道锁文件并在访问目录之前获取锁。因此,强制锁定在这里没有帮助,您需要建议锁定。
Linux 中存在三种建议文件锁:
flock(2)(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
Run Code Online (Sandbox Code Playgroud)
附言。
使用这种方法,如果随机进程不知道您的锁定文件,则无法阻止它访问您的目录。可能可以使用FUSE实现支持强制目录锁的文件系统,但我不知道这样的实现。