【问题标题】:How to lock a directory between python processes in linux?如何锁定linux中python进程之间的目录?
【发布时间】:2015-09-15 18:00:22
【问题描述】:

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

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

有没有标准的 linux 方法可以做到这一点?也许我可以用 python 的 shell 行来执行一些东西?

【问题讨论】:

  • 您要确保没有其他进程或其他 Python 进程可以从该目录读/写吗?
  • 理想情况下没有其他进程,但由于我现在写的所有内容都在 python 中,所以只有 Python 进程是可以的。这样,如果需要该路线,我可以控制他们寻找的内容。我希望找到一个预制的解决方案来解决看似常见的需求,尽管这并不特定于 python 或我的应用程序。

标签: python linux python-3.4


【解决方案1】:

Linux

Linux 中有两种标准类型的锁定:advisory locking(在 POSIX 中指定)和mandatory locking(特定于 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

附言。

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

【讨论】:

  • 您可以在目录上应用咨询锁很好,请参阅How can I lock a directory in C on a linux machine。使用os.open() 获取目录的文件句柄。
  • 唯一的缺点是你没有地方记录过程信息(.lock 文件或 symlink 为你提供了放置元数据的地方)。
【解决方案2】:

您可以对目录应用锁。这是建议性的(它不会停止不关心接触目录的锁的进程)。锁定将一直存在,直到您的程序终止。代码很简单。

lockfd = os.open('.',os.O_RDONLY)
fcntl.flock(lockfd,fcntl.LOCK_EX | fcntl.LOCK_NB)

如果我对手册页的理解是正确的,您可以通过简单的操作来解锁它。

os.close(lockfd)

但我没有对此进行测试,因为在我的应用程序中,它希望锁在脚本整个运行过程中持续存在。

【讨论】:

    猜你喜欢
    • 2010-11-29
    • 2014-10-22
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2014-12-03
    相关资源
    最近更新 更多