一尘不染

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

linux

有什么简单的方法可以在Linux上的Python中使用系统范围的互斥锁?“全系统”是指互斥体将由一组Python 进程使用
;这与传统互斥锁相反,传统互斥锁由同一进程中的一组 线程 使用。

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

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

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


阅读 287

收藏
2020-06-03

共1个答案

一尘不染

Unix的“传统”答案是使用文件锁。您可以lockf(3)用来锁定文件的各个部分,以便其他进程无法对其进行编辑。一个非常普遍的滥用是将其用作进程之间的互斥体。python等效项是fcntl.lockf

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

因为您的锁位于全局名称空间(文件系统)中,并且可用于所有进程,所以这可以满足您的所需。这种方法还具有非Python程序可以参与锁定的好处。缺点是您需要一个放置该锁文件的位置;另外,某些文件系统实际上并没有正确锁定,因此存在无提示无法实现排除的风险。你赢了一些,你输了一些。

2020-06-03