如何在linux中锁定python进程之间的目录?

如何在linux中锁定python进程之间的目录?,python,linux,python-3.4,Python,Linux,Python 3.4,我有两个(或更多)python进程正在运行,希望创建一个类似于共享资源的概念。本例中的“共享资源”是一个目录。如何最容易/标准地/etc实现互斥?一个隐藏的.lock文件,每个进程都同意检查该文件,如果存在,则将其PID追加为新行,然后在访问该文件时弹出其PID 我基本上只想清除一个目录,并确保在我清除它时没有其他进程尝试读取或写入它 有没有一种标准的linux方式可以做到这一点?也许我可以用python中的shell行执行一些东西?Linux Linux中有两种标准类型的锁定:(在POSIX中

我有两个(或更多)python进程正在运行,希望创建一个类似于共享资源的概念。本例中的“共享资源”是一个目录。如何最容易/标准地/etc实现互斥?一个隐藏的
.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
文件或符号链接为您提供了放置元数据的位置)。