Linux 上 Python 中的系统范围互斥锁

新手上路,请多包涵

有什么简单的方法可以在 Linux 上的 Python 中使用系统范围的互斥锁吗? “系统范围”是指互斥量将由一组 Python 进程 使用;这与传统的互斥锁形成对比,后者由同一进程中的一组 线程 使用。

编辑:我不确定 Python 的 multiprocessing 包是我需要的。例如,我可以在两个不同的解释器中执行以下操作:

 from multiprocessing import Lock
L = Lock()
L.acquire()

当我在两个单独的解释器中同时执行这些命令时,我希望其中一个挂起。相反,两者都没有挂起;看来他们没有获得相同的互斥量。

原文由 emchristiansen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 687
2 个回答

“传统的”Unix 答案是使用文件锁。您可以使用 lockf(3) 锁定文件的各个部分,以便其他进程无法编辑它;一个非常常见的滥用是将其用作进程之间的互斥锁。 python 等价物是 fcntl.lockf

传统上,您将锁定进程的 PID 写入锁定文件,这样由于持有锁定的进程死亡而导致的死锁是可识别和可修复的。

这会让你得到你想要的,因为你的锁在一个全局命名空间(文件系统)中并且所有进程都可以访问。这种方法还有一个好处,即非 Python 程序可以参与您的锁定。缺点是你需要一个地方来存放这个锁文件;此外,一些文件系统实际上并没有正确锁定,因此存在无法实现排除的风险。你赢了一些,你失去了一些。

原文由 zmccord 发布,翻译遵循 CC BY-SA 3.0 许可协议

试试 ilock 库:

 from ilock import ILock

with ILock('Unique lock name'):
    # The code should be run as a system-wide single instance
    ...

原文由 Symon 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题