2011-08-03 110 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 
    ...