Dateischloss funktioniert nicht wie erwartet
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?
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.