2012-08-07 9 views
6

Ich muss Python-Threads und Prozesse (nicht notwendig miteinander verwandt) mit named Sperre (Dateisperre zum Beispiel) synchronisieren. Vorzugsweise sollte es Leser-Schreiber-Sperre sein. Ich habe versucht, fcntl.flock (es beide exklusiv haben und gemeinsame Sperre Erwerb), aber es bietet keine gewünschte Maß an Sperr - Does python's fcntl.flock function provide thread level locking of file access?Shared und exklusive benannte Sperre für Python

Meine Lösung so weit ist lockfile mit Memcached zu verwenden (oder mmap'ed gesperrte Datei). Lockfile synchronisiert den Zugriff und memcached zählt die Reader/Writer.

Gibt es bessere/schnellere Lösungen? Kennen Sie ein Projekt, das dieses Problem bereits löst?

+0

Ich würde auch an jeder Lösung interessiert sein. – cji

+0

Probieren Sie die [ilock] (https://github.com/symonsoft/ilock) -Bibliothek aus – Symon

Antwort

2

Hier ist ein Link http://semanchuk.com/philip/ mit Bibliotheken, die Posix- und System V-Semaphoren implementieren. Sie können einen davon verwenden. Aber hüte dich davor, dass in einer Situation, in der der prozesshaltende Semaphor stirbt, ohne ihn loszulassen - alle anderen hängen bleiben. Wenn Sie Angst davor haben - Sie können System V Semaphore mit UNDO verwenden, aber sie sind ein wenig langsamer. Wenn Sie zufällig System V Shared Memory-Primitive verwenden - denken Sie daran, dass sie im Kernel leben und nach dem Prozessende weiterleben - müssen Sie sie explizit aus dem System entfernen.

Wenn Sie keine Angst haben, von Prozessen und Deadlock ganzer System und Verfahren zu sterben beziehen - (. Sie sind Posix genannt Semaphore) Sie den Python Semaphore verwenden könnte

Die Seite, die Sie als nahe stehende Frage (fcntl) verknüpft hat Ich sage nicht, dass fcntl nicht für Inter-Thread-Locking geeignet ist. Es sagt, dass fcntl sich um fds kümmert. Sie können also fcntl für Interprozess- und Inter-Thread-Sperren verwenden, solange Sie die Sperrdatei öffnen und für jede Sperrinstanz ein neues fd erhalten.

Sie können auch eine Kombination aus fcntl für Interprozess und Python Semaphor für Inter-Thread-Sperren verwenden.

Und schließlich: Überdenken Sie Ihre Architektur. Sperren ist in der Regel schlecht. Delegieren Sie Ressourcen an einen Prozess, der sich ohne Sperren darum kümmert. Es wird viel einfacher zu pflegen sein. Das können Sie mir glauben.

Verwandte Themen