Linux系统上的Python互斥体

在Linux上有什么简单的方法在Python上进行系统互斥? “系统范围”是指一组Python 进程使用互斥锁; 这与传统的互斥体形成对比,传统的互斥体在同一过程中被一组线程所使用。

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

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

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

Unix的“传统”答案是使用文件locking。 您可以使用lockf(3)来locking文件的某些部分,以便其他进程无法对其进行编辑; 一个非常普遍的滥用就是用这个作为进程之间的互斥。 python等价物是fcntl.lockf 。

传统上,您将locking过程的PID写入locking文件,以便在locking过程中由于死亡进程而导致的死锁是可识别和可修复的。

这就得到了你想要的,因为你的锁在全局命名空间(文件系统)中,并且可以被所有进程访问。 这种方法也有非Python程序可以参与您的locking的特权。 缺点是你需要一个锁住这个文件的地方; 另外,有些文件系统实际上并没有正确locking,所以存在一个风险,就是它会默默无法排除。 你赢了一些,你输了一些。

POSIX标准规定了可用于此目的的进程间信号量。 http://linux.die.net/man/7/sem_overview

Python中的multiprocessing模块build立在这个API和其他的API之上。 特别是multiprocessing.Lock提供了一个跨进程的“互斥”。 http://docs.python.org/library/multiprocessing.html#synchronization-between-processes

编辑回复编辑的问题:

在你的概念validation中,每个进程都在构造一个Lock() 。 所以你有两个独立的锁。 这就是为什么这两个过程都没有等待 您将需要在进程之间共享相同的locking。 我在multiprocessing文档中链接到的部分解释了如何做到这一点。

对于允许绝对独立进程同步的系统范围的互斥体(例如,不属于相同进程树的INCLUDE Linux进程),只需使用fcntl.flock即可 。 我想在Linux下使用一个内存文件/ run / shm文件夹可能会使其执行速度更快。

在这里看到更多。