如何在linux中锁定python进程之间的目录?
我有两个(或更多)python进程正在运行,希望创建一个类似于共享资源的概念。本例中的“共享资源”是一个目录。如何最容易/标准地/etc实现互斥?一个隐藏的如何在linux中锁定python进程之间的目录?,python,linux,python-3.4,Python,Linux,Python 3.4,我有两个(或更多)python进程正在运行,希望创建一个类似于共享资源的概念。本例中的“共享资源”是一个目录。如何最容易/标准地/etc实现互斥?一个隐藏的.lock文件,每个进程都同意检查该文件,如果存在,则将其PID追加为新行,然后在访问该文件时弹出其PID 我基本上只想清除一个目录,并确保在我清除它时没有其他进程尝试读取或写入它 有没有一种标准的linux方式可以做到这一点?也许我可以用python中的shell行执行一些东西?Linux Linux中有两种标准类型的锁定:(在POSIX中
.lock
文件,每个进程都同意检查该文件,如果存在,则将其PID追加为新行,然后在访问该文件时弹出其PID
我基本上只想清除一个目录,并确保在我清除它时没有其他进程尝试读取或写入它
有没有一种标准的linux方式可以做到这一点?也许我可以用python中的shell行执行一些东西?Linux
Linux中有两种标准类型的锁定:(在POSIX中指定)和(特定于Linux)
但是,这两种方法只能应用于文件,而不能应用于目录。是的,你需要一个锁文件。它假定所有用户都应该知道锁文件,并在访问目录之前获取锁。因此,强制锁定在这里没有帮助,您需要建议锁定
Linux中有三种建议文件锁:
- (POSIX中规定)李>
- POSIX记录锁定,请参阅和包装中的“建议记录锁定”部分(两者都在POSIX中指定)李>
- 打开文件描述锁,请参阅(Linux特定,在最近的内核中提供)
Python 在Python中,
flock()
、lockf()
和fcntl()
函数通过模块提供。还有一个模块为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.
使用这种方法,如果随机进程不知道您的锁文件,则无法阻止它访问您的目录。可能可以使用支持强制目录锁的实现文件系统,但我不知道有这种实现。您可以在目录上应用群集锁。这是建议性的(它不会停止那些不关心锁与目录接触的进程)。锁将一直存在,直到程序终止。代码非常简单
lockfd = os.open('.',os.O_RDONLY)
fcntl.flock(lockfd,fcntl.LOCK_EX | fcntl.LOCK_NB)
如果我对手册页的理解是正确的,您只需执行以下操作即可解锁它
os.close(lockfd)
但是我没有在我的应用程序中对此进行测试,因为我希望在整个脚本运行过程中保持锁定。是否要确保没有其他进程或其他Python进程可以从该目录进行r/w?理想情况下,没有其他进程,但由于我现在编写的所有内容都是Python,所以只有Python进程可以。这样,如果需要那条路线,我可以控制他们寻找什么。我希望找到一个预先制作好的解决方案,来满足一种常见的需求,尽管这不是python或我的应用程序所特有的。使用
os.open()
获取目录的文件句柄。唯一的缺点是您没有地方记录进程信息(一个.lock
文件或符号链接为您提供了放置元数据的位置)。