有什么简单的方法可以在 Linux 上的 Python 中使用系统范围的互斥锁吗? “系统范围”是指互斥量将由一组 Python 进程 使用;这与传统的互斥锁形成对比,后者由同一进程中的一组 线程 使用。
编辑:我不确定 Python 的 multiprocessing
包是我需要的。例如,我可以在两个不同的解释器中执行以下操作:
from multiprocessing import Lock
L = Lock()
L.acquire()
当我在两个单独的解释器中同时执行这些命令时,我希望其中一个挂起。相反,两者都没有挂起;看来他们没有获得相同的互斥量。
原文由 emchristiansen 发布,翻译遵循 CC BY-SA 4.0 许可协议
“传统的”Unix 答案是使用文件锁。您可以使用
lockf(3)
锁定文件的各个部分,以便其他进程无法编辑它;一个非常常见的滥用是将其用作进程之间的互斥锁。 python 等价物是 fcntl.lockf 。传统上,您将锁定进程的 PID 写入锁定文件,这样由于持有锁定的进程死亡而导致的死锁是可识别和可修复的。
这会让你得到你想要的,因为你的锁在一个全局命名空间(文件系统)中并且所有进程都可以访问。这种方法还有一个好处,即非 Python 程序可以参与您的锁定。缺点是你需要一个地方来存放这个锁文件;此外,一些文件系统实际上并没有正确锁定,因此存在无法实现排除的风险。你赢了一些,你失去了一些。