我有两个(或更多)python进程正在运行,并希望为共享资源创建类似于exclusion mutex的概念。共享资源'在这种情况下是一个目录。我最容易/标准地/等等如何实现互斥锁?每个进程同意检查的隐藏$ACL = Get-Acl $RegistryKey -Audit
$ACL.RemoveAuditRule($AuditRule)
$ACL | Set-Acl -Path $RegistryKey
文件,如果存在,则将其PID附加为新行,然后在有权访问该文件时弹出其PID?
我基本上只想清除目录,并确保在我清除目录时没有其他进程尝试读取或写入目录。
有没有一种标准的linux方式呢?也许我可以用python中的shell行执行某些操作?
答案 0 :(得分:1)
<强>的Linux 强>
Linux中有两种标准类型的锁定:advisory locking(在POSIX中指定)和mandatory locking(特定于Linux)。
但是,它们都只能应用于文件,而不能应用于目录。所以是的,你需要一个锁文件。它假定所有用户都应该知道锁文件并在访问目录之前获取锁。因此,强制锁定在这里没有帮助,您需要建议锁定。
Linux中有三种咨询文件锁:
flock(2)
(在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)
但是我还没有进行测试,因为在我的应用程序中,希望锁在整个脚本运行期间都保持不变。