it-swarm.com.de

Systemweiter Mutex in Python unter Linux

Gibt es eine einfache Möglichkeit, einen systemweiten Mutex in Python unter Linux zu haben? Mit "systemweit" meine ich, dass der Mutex von einer Gruppe von Python Prozessen verwendet wird. Dies steht im Gegensatz zu einem herkömmlichen Mutex, der von einer Gruppe von Threads innerhalb desselben Prozesses verwendet wird.

BEARBEITEN: Ich bin nicht sicher, ob ich das Paket Python multiprocessing brauche. Ich kann zum Beispiel Folgendes auf zwei verschiedene Interpreter ausführen:

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

Wenn ich diese Befehle gleichzeitig in zwei separaten Interpreten ausführen möchte, möchte ich, dass einer davon hängen bleibt. Stattdessen bleibt keiner hängen. es scheint, dass sie nicht den gleichen Mutex erwerben.

45
emchristiansen

Die "traditionelle" Unix-Antwort besteht in der Verwendung von Dateisperren. Sie können lockf(3) verwenden, um Abschnitte einer Datei zu sperren, sodass andere Prozesse sie nicht bearbeiten können. Ein sehr häufiger Missbrauch besteht darin, dies als Mutex zwischen Prozessen zu verwenden. Das Python-Äquivalent lautet fcntl.lockf

Üblicherweise schreiben Sie die PID des Sperrvorgangs in die Sperrdatei, so dass Deadlocks aufgrund von Prozessen, die während des Haltens der Sperre stecken, identifizierbar und fixierbar sind.

Dadurch erhalten Sie, was Sie möchten, da sich Ihre Sperre in einem globalen Namespace (dem Dateisystem) befindet und für alle Prozesse zugänglich ist. Dieser Ansatz hat auch den Vorteil, dass Nicht-Python-Programme an Ihrem Sperren teilnehmen können. Der Nachteil ist, dass Sie einen Ort benötigen, an dem diese Sperrdatei leben kann. Außerdem sperren einige Dateisysteme nicht wirklich richtig, daher besteht die Gefahr, dass der Ausschluss ohne weitere Benachrichtigung nicht erreicht wird. Du gewinnst etwas, du verlierst etwas.

25
zmccord

Der POSIX-Standard legt Interprozess-Semaphore fest, die zu diesem Zweck verwendet werden können. http://linux.die.net/man/7/sem_overview

Das multiprocessing-Modul in Python basiert auf dieser API und anderen. Insbesondere stellt multiprocessing.Lock einen prozessübergreifenden "Mutex" bereit. http://docs.python.org/library/multiprocessing.html#synchronization-between-prozesses

EDIT, um auf die bearbeitete Frage zu antworten:

In Ihrem Proof of Concept erstellt jeder Prozess eine Lock(). Sie haben also zwei getrennte Schlösser. Deshalb wartet keiner der Prozesse. Sie müssen die gleiche Sperre zwischen Prozessen teilen. In dem Abschnitt, auf den ich in der multiprocessing-Dokumentation verlinkt habe, wird erläutert, wie das gemacht wird.

11
wberry

Versuchen Sie ilock library:

from ilock import ILock

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

Für einen systemweiten Mutex, der die Synchronisation absolut getrennter Prozesse ermöglicht (d. H. Für INCLUDE Linux-Prozesse, die NICHT zum selben Prozessbaum gehören), verwenden Sie einfach fcntl.flock . Ich nehme an, dass die Verwendung einer Speicherdatei unter Linux '/ run/shm' Ordner dazu führen kann, dass sie schneller arbeitet.

Sehen Sie mehr hier .

1
Ofer

Um der Liste eine Eins hinzuzufügen, gibt es die Bibliothek posix_ipc mit der Klasse Semaphore.

Ein Semaphor mit einer Anzahl von 1 kann als Mutex verwendet werden. Um das Threading-Trio zu vervollständigen, verwendet die Bibliothek SystemEventposix_ipc und liefert ebenfalls ein Ereignis .

0
c z