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

时间:2015-09-15 18:00:23

标签: python linux python-3.4

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

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

有没有一种标准的linux方式呢?也许我可以用python中的shell行执行某些操作?

2 个答案:

答案 0 :(得分: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

<强> PS。

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

答案 1 :(得分:0)

您可以在目录上应用羊群锁。这只是建议(不会停止不关心锁定目录的进程)。锁定将一直持续到您的程序终止。该代码非常简单。

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

如果我对手册页的理解是正确的,则只需执行一下操作即可将其解锁。

os.close(lockfd)

但是我还没有进行测试,因为在我的应用程序中,希望锁在整个脚本运行期间都保持不变。