Frage

Ich habe ein Thread-Ertingende Klasse, die nur eine Instanz gleichzeitig ausführen soll (Querverfahren). Um dies zu erreichen, versuche ich, eine Dateisperre zu verwenden. Hier sind Teile meines Codes:

class Scanner(Thread):

  def __init__(self, path):
    Thread.__init__(self)
    self.lock_file = open(os.path.join(config.BASEDIR, "scanner.lock"), 'r+')
    fcntl.lockf(self.lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB)

  # Stuff omitted

  def run(self):
    logging.info("Starting scan on %s" % self.path)

    # More stuff omitted

    fcntl.lockf(self.lock_file, fcntl.LOCK_UN)

Ich hatte das erwartet lockf Rufen Sie an, um eine Ausnahme zu machen, wenn a Scanner Der Thread wurde bereits ausgeführt und initialisiert das Objekt überhaupt nicht. Ich kann dies jedoch im Terminal sehen:

INFO:root:Starting scan on /home/felix/Music
INFO:root:Starting scan on /home/felix/Music
INFO:root:Scan finished
INFO:root:Scan finished

Was darauf hindeutet, dass zwei Scanner Die Themen werden gleichzeitig ausgeführt, keine Ausnahme geworfen. Ich bin sicher, ich vermisse hier etwas wirklich Grundlegendes, aber ich kann nicht herausfinden, was das ist. Kann jemand helfen?

War es hilfreich?

Lösung

Fand die Lösung am Ende selbst. Es war zu benutzen fcntl.flock() Anstatt von fcntl.lockf(), mit genau den gleichen Parametern. Ich bin mir nicht sicher, warum das einen Unterschied gemacht hat.

Andere Tipps

Sie öffnen die Sperrdatei mithilfe r+ Dies löscht die vorherige Datei und erstellt eine neue. Jeder Thread sperrt eine andere Datei.

Verwenden w oder r+a

Neben der Verwendung von Flock musste ich auch die Datei wie SO öffnen:

fd = os.open(lockfile, os.O_CREAT | os.O_TRUNC | os.O_WRONLY)

Es funktioniert nicht andere weise.

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