Konflikt trotz lock

08/02/2009 - 14:20 von Florian Lindner | Report spam
Hallo,
ich wundere mich gerade sehr über einen Fehler in einem kleinem
Programm welches in 2 Threads Dateien von flac nach mp3 umwandelt.
Dabei wird für jedes Album ein Verzeichnis erstellt. Als Thread starte
ich die Funktion fileWalker zweimal. Die Funktion schaut im
wesentlichen etwa so aus:

def fileWalker(files, action, file_count):
lock = threading.Lock()
lock.acquire()
if not os.path.exists(f[2]):
os.mkdir(f[2]) # Zeile 98
lock.release()

Allerdings bekomme ich die Meldung:

Exception in thread Thread-2:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/threading.py", line 460, in __bootstrap
self.run()
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/threading.py", line 440, in run
self.__target(*self.__args, **self.__kwargs)
File "conv.py", line 98, in fileWalker
os.mkdir(f[2])
OSError: [Errno 17] File exists: '/Users/florian/dev/conv/mp3/
Apocalyptica - Apocalyptica'

Es sieht also für mich so aus, als ob trotz lock und Prüfung das
Verzeichnis ein zweites mal probiert wird zu erstellen. Warum das?

Danke,

Florian
 

Lesen sie die antworten

#1 Stefan Behnel
08/02/2009 - 14:28 | Warnen spam
Florian Lindner schrieb:
ich wundere mich gerade sehr über einen Fehler in einem kleinem
Programm welches in 2 Threads Dateien von flac nach mp3 umwandelt.
Dabei wird für jedes Album ein Verzeichnis erstellt. Als Thread starte
ich die Funktion fileWalker zweimal. Die Funktion schaut im
wesentlichen etwa so aus:

def fileWalker(files, action, file_count):
lock = threading.Lock()
lock.acquire()
if not os.path.exists(f[2]):
os.mkdir(f[2]) # Zeile 98
lock.release()

Es sieht also für mich so aus, als ob trotz lock und Prüfung das
Verzeichnis ein zweites mal probiert wird zu erstellen. Warum das?



weil du für jeden Thread einen eigenen Lock erzeugst. Schieb das

lock = threading.Lock()

statt dessen in das Hauptprogramm und übergib dem Thread den Lock als
Parameter, dann sollte es funktionieren.

Noch eine Frage: warum erstellst du das Zielverzeichnis nicht einfach aus
dem Hauptprogramm heraus?

Stefan

Ähnliche fragen