Lock auf file mit zwei Python Skripten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Ruben
User
Beiträge: 4
Registriert: Freitag 8. Mai 2015, 08:29

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

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.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Dafür gibt es übrigens eine äußerst praktische Library.
Benutzeravatar
sparrow
User
Beiträge: 4599
Registriert: Freitag 17. April 2009, 10:28

Wenn es nur darum geht, dass zwei deiner Programme miteinander kommunizieren sollen, könnte das auch über eine Netzwerkschnittstelle abgebildet werden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Ruben
User
Beiträge: 4
Registriert: Freitag 8. Mai 2015, 08:29

@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!
Antworten