2011-08-03 68 views
39

在Linux上有什么简单的方法在Python中实现全系统互斥体?对于“系统范围”,我的意思是一组Python 进程将使用该互斥体;这与传统的互斥体相反,在一个过程中,线程组使用该传统互斥体。Linux系统范围的Python互斥体

编辑:我不知道Python的multiprocessing包是我需要的。例如,我可以用两种不同的解释执行以下命令:当我在两个不同的解释同时执行这些命令

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

,我想其中的一个挂起。相反,它们都不会挂起;看起来他们并没有获得相同的互斥量。

+0

http://stackoverflow.com/questions/5756813/simple-but-fast-ipc-method-for-a-python-and-c-application – Anycorn

+0

有你找到一个好的解决方案 – redice

回答

22

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

传统上,您将锁定过程的PID写入锁定文件,以便在持有锁定期间死于进程的死锁是可识别和可修复的。

由于您的锁位于全局命名空间(文件系统)中并且可供所有进程访问,因此可以获得您想要的结果。这种方法也有非Python程序可以参与锁定的特性。缺点是你需要一个地方让这个锁文件生存;另外,有些文件系统实际上并没有正确锁定,所以存在一种风险,它会默默无法实现排除。你赢了一些,你输了一些。

+1

锁文件的逻辑位置是'/ var/lock' - 但是如果将要有大量的锁操作,我建议'/ tmp'因为并非所有的系统都在'tmpfs'中有'/ var/lock' RAMDISK。 – Kimvais

+0

并非所有的系统都有/ tmp在tmpfs ramdisk中;我安装的OS X似乎并没有。尽管如此,好点也是如此。 – zmccord

+0

他询问_linux_和大多数(如果不是全部的话)现代linux发行版在/ tmpfs中都有/ tmp - 没有默认IIRC中的/ var/lock。 – Kimvais

10

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

Python中的multiprocessing模块基于此API等构建。特别是,multiprocessing.Lock提供了一个跨进程的“互斥体”。 http://docs.python.org/library/multiprocessing.html#synchronization-between-processes

编辑回应编辑的问题:

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

+0

谢谢,但“多处理”似乎不是我所需要的;看到编辑的问题。 – emchristiansen

+0

编辑我的答案。 – wberry

+15

链接的部分显示了主进程如何产生10个进程,并将Lock对象传递给它创建的每个进程。我的用例不同,因为没有主进程产卵子进程。就我而言,每个进程都是独立调用的,但它们仍然必须协调。 – emchristiansen

0

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

查看更多here

0

尝试ilock库:

from ilock import ILock 

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