Frage

Pythons fcnt Modul stellt eine Methode namens [Herde] [1] zu geprüftes Sperren von Dateien. Es Beschreibung lautet:

  

Führen Sie die Sperroperation op auf Datei   fd (Dateiobjekte bereitstellt   a fileno () Methode akzeptiert werden als   Gut). Siehe den Unix-Manual-Herd (2)   für Details. (Auf einigen Systemen dieses   Funktion emuliert wird mit fcntl ().)

Linux-man-Seite für Herde Aufblickend es bezieht sich nur auf Querprozessverriegelung, zum Beispiel:

  

Ein Aufruf scharen () blockieren kann, wenn ein   inkompatible Sperre wird durch einen anderen gehalten   Prozess. Um einen nicht-blockierend   Anfrage, umfassen LOCK_NB (durch ODER-Verknüpfung)   mit einem der oben genannten Operationen.

Also meine Frage ist: wird Herd () auch Gewinde sichere Verriegelung bieten und sperrt mehrere Threads innerhalb desselben Prozesses sowie Fäden aus verschiedenen Prozessen

[1]: http://docs.python.org/library/ fcntl.html # fcntl.flockfunction wird mit fcntl emuliert ().)

War es hilfreich?

Lösung

flock Schlösser kümmern sich nicht um Themen - in der Tat, sie kümmern sich nicht um Prozesse, auch nicht. Wenn Sie den gleichen Dateideskriptor in zwei Prozesse nehmen (durch eine Gabel geerbt), entweder Prozess mit dem File-Locking, dass FD eine Sperre für beide Prozesse erwerben. Mit anderen Worten, in dem folgenden Code beide flock Anrufe Erfolg zurück: das Kind Prozess die Datei sperrt, und dann erhält der übergeordnete Prozess die gleiche Sperre nicht blockieren, weil sie beide die gleichen FD sind .

import fcntl, time, os

f = open("testfile", "w+")
print "Locking..."
fcntl.flock(f.fileno(), fcntl.LOCK_EX)
print "locked"
fcntl.flock(f.fileno(), fcntl.LOCK_UN)

if os.fork() == 0:
    # We're in the child process, and we have an inherited copy of the fd.
    # Lock the file.
    print "Child process locking..."
    fcntl.flock(f.fileno(), fcntl.LOCK_EX)
    print "Child process locked..."
    time.sleep(1000)
else:
    # We're in the parent.  Give the child process a moment to lock the file.
    time.sleep(0.5)

    print "Parent process locking..."
    fcntl.flock(f.fileno(), fcntl.LOCK_EX)
    print "Parent process locked"
    time.sleep(1000)

Auf dem gleichen Grund, wenn Sie die gleiche Datei zweimal zu sperren, aber mit unterschiedlichen Datei-Deskriptoren, werden die Sperren gegenseitig blockieren - unabhängig davon, ob Sie in dem gleichen Prozess oder dem selben Thread. Siehe Herd (2): If a process uses open(2) (or similar) to obtain more than one descriptor for the same file, these descriptors are treated independently by flock(). An attempt to lock the file using one of these file descriptors may be denied by a lock that the calling process has already placed via another descriptor.

Es ist nützlich, sich daran zu erinnern, dass auf dem Linux-Kernel, Prozesse und Threads sind im Wesentlichen die gleiche Sache, und sie sind im Allgemeinen die gleichen durch Kernel-Level-APIs behandelt. Für den größten Teil, wenn ein syscall Dokumente Inter Kind / Eltern Verhalten, wird das gleiche für Fäden halten.

Natürlich können Sie (und wahrscheinlich sollte) testen dieses Verhalten selbst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top