Seite 1 von 1

Lock auf file mit zwei Python Skripten

Verfasst: Freitag 8. Mai 2015, 08:37
von Ruben
Hallo zusammen

Ich verwende zwei Skripte.
Das eine Skript schreibt einen Wert in ein file.
Das andere Skript liest den Wert aus dem file.


Jetzt hatte ich das Problem, dass sie gleichzeitig auf das file zugreifen wollten und ich habe den folgenden Error bekommen:
Traceback (most recent call last):
File "read_time.py", line 53, in <module>
if time.time() - read() >= max:
File "read_time.py", line 28, in read
t = pickle.load(f)
File "/usr/lib/python2.7/pickle.py", line 1378, in load
return Unpickler(file).load()
File "/usr/lib/python2.7/pickle.py", line 858, in load
dispatch[key](self)
File "/usr/lib/python2.7/pickle.py", line 880, in load_eof
raise EOFError
EOFError

Gibt es eine Methode einen lock auf das file zu legen, damit immer nur ein Skript auf die Datei zugreifen kann?
Danke für jede Hilfe.

Re: Lock auf file mit zwei Python Skripten

Verfasst: Freitag 8. Mai 2015, 09:54
von Hyperion
Wie hoch ist denn die Zugriffsfrequenz? Wenn nur selten auf die Datei zugegriffen wird, kann man die Exception ja abfangen und es nach einer kleinen Pause erneut versuchen...

Wenn Du hochfrequent konkurrierend Daten austauschen willst, sind Dateien einfach nicht das Mittel der Wahl und Du solltest Message-Queues ins Auge fassen oder Datenbanken jeglicher Coleur.

Re: Lock auf file mit zwei Python Skripten

Verfasst: Freitag 8. Mai 2015, 09:58
von lackschuh
Ich glaube nicht, dass es damit zusammen hängt, dass zwei Programme gleichzeitig die pickle Datei lesen sondern dass das eine Programm irgendwann versucht die Datei zu lesen und das andere Programm just in dieser Zeit die Datei neu schreibt, so dass die Datei im Bruchteil dieser Sekunde leer ist.

Re: Lock auf file mit zwei Python Skripten

Verfasst: Freitag 8. Mai 2015, 10:44
von Sirius3
@lackschuh: die Lösung ist, die Datei nicht zu überschreiben, sondern eine neue Datei zu schreiben und danach in den Namen der alten Datei umzubenennen. Umbenennen ist in den meisten Dateisystemen ein atomarer Prozess.

Re: Lock auf file mit zwei Python Skripten

Verfasst: Freitag 8. Mai 2015, 11:07
von DasIch
Dafür gibt es übrigens eine äußerst praktische Library.

Re: Lock auf file mit zwei Python Skripten

Verfasst: Freitag 8. Mai 2015, 13:18
von sparrow
Wenn es nur darum geht, dass zwei deiner Programme miteinander kommunizieren sollen, könnte das auch über eine Netzwerkschnittstelle abgebildet werden.

Re: Lock auf file mit zwei Python Skripten

Verfasst: Freitag 8. Mai 2015, 13:27
von Hyperion
Wobei man sich dann auch noch fragen könnte, ob ``pickle`` dafür wirklich die richtige Wahl ist. Denn sobald verschiedene Scripte die Daten lesen sollen, besteht die Gefahr von inkompatiblen Versionen! Da bieten sich eher Sprach unabhängige Formate wie JSON, Protocol Buffers, XML usw. an.

Re: Lock auf file mit zwei Python Skripten

Verfasst: Samstag 9. Mai 2015, 14:00
von Ruben
@Hyperion: Danke für den Tipp. Die Zugriffsfrequenz liegt bei einigen Minuten bis Stunden. Wie müsste ich das umsetzten dass ich diesen Error abfangen und so verhindern kann dass mein Skript abgebrochen wird? Habe leider noch keine Erfahrung mit Exceptions. Kannst du mir da einen Tipp geben?

@DasIch: Danke ich werde mir diese Variante mal zu Herzen nehmen. :)

Danke auch allen anderen für die Tipps!