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

tar*_*yte 5 python linux python-3.4

我有两个(或更多)python进程在运行,并且想要创建一个类似于共享资源的排除互斥锁的概念.在这种情况下,"共享资源"是一个目录.我最容易/标准地/等等如何实现互斥锁?.lock每个进程同意检查的隐藏文件,如果存在,则将其PID附加为新行,然后在有权访问该文件时弹出其PID?

我基本上只是想清除一个目录,并确保在我清除它时没有其他进程尝试读取或写入它.

是否有标准的linux方式这样做?也许我可以用python的shell行执行某些操作?

gav*_*avv 5

Linux

Linux 中有两种标准的锁定类型:咨询锁定(POSIX 中指定)和强制锁定(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
Run Code Online (Sandbox Code Playgroud)

附言。

使用这种方法,如果随机进程不知道您的锁定文件,则无法阻止它访问您的目录。可能可以使用FUSE实现支持强制目录锁的文件系统,但我不知道这样的实现。

  • 您可以在目录上应用咨询锁**就好**,请参阅[如何在 Linux 计算机上锁定 C 中的目录](//stackoverflow.com/q/8816941)。使用 os.open() 获取目录的文件句柄。 (2认同)