Gemeinsammer Dateizugriff

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
sttrader
User
Beiträge: 53
Registriert: Dienstag 12. Januar 2010, 11:22
Kontaktdaten:

Hallo

Ich habe mal eine kleine Frage an euch. Ich habe ein Programm das ständig (ein par mal in der Minute) in ein txt File schreibt und Python Programm das dieses File Ständig ausliest nun kommt es aber vor das sich beide Programme hin und wider im weg stehen und das Lesende Programm abbricht. Wie kann ich sicher stellen das das txt File gerade nicht durch ein anderes Programm genutzt wird und erst dann auslesen????

Über vorschläge wäre ich euch sehr Dankbar.

LG
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Um welches Betriebssystem handelt es sich?

Generell ist sowas mit Lese/Schreib-Locks realisierbar, wobei der Prozess, der den Lock anfordert, halt warten muss, bis der entsprechende Lock verfügbar ist.
sttrader
User
Beiträge: 53
Registriert: Dienstag 12. Januar 2010, 11:22
Kontaktdaten:

Ich Benutze Linux.

LG
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Das Modul fcntl sollte da weiterhelfen.
sttrader
User
Beiträge: 53
Registriert: Dienstag 12. Januar 2010, 11:22
Kontaktdaten:

Danke für die Tips mal sehen ob etwas davon klappt ich habe ja das Problem das ich keinen einfluss auf das Schreibende Programm habe, nur auf das Lesende Programm.

LG
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Benenne vor dem Lesen die Datei um. Es ist unter Unix garantiert, dass os.rename() eine atomare Operation ist. Dann kann dir das andere Programm nicht in die Datei schreiben, während du sie noch ausliest.

Stefan
BlackJack

@sma: Wenn das andere Programm die Datei offen hat und gerade schreibt, hilft umbenennen nicht, denn auch durch das Umbenennen bleibt es ja die gleiche Datei, auf die dann beide Programme gleichzeitig zugreifen. Man hat in dem Fall immer noch die Situation dass Programm A in die Datei schreibt und Programm B gleichzeitig die nicht vollständige Datei versucht zu verarbeiten.

Ausserdem ist der OP IMHO nicht ganz klar in der Aussage ob Programm A die Datei immer neu erstellt oder ob es sich um eine Art Protokolldatei handelt bei der immer nur neue Daten dazu geschrieben werden. Dann würde man mit Umbenennen A entweder das Protokoll wegnehmen wenn es die Datei immer neu öffnet, oder aber rein gar nichts erreichen wenn A die Datei ständig offen hält.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Du hast Recht, das klingt eher nach Log-Datei. Da ist es natürlich schwierig, sauber zu lesen, wenn das schreibende Programm nicht sauber, d.h. mit nur einem os.write() Syscall-Äquivalent jeden Eintrag schreibt (denn auch diese sind in Unix atomar).

Stefan
sttrader
User
Beiträge: 53
Registriert: Dienstag 12. Januar 2010, 11:22
Kontaktdaten:

Hallo

Das Programm das die Datei schreibt schreibt Praktisch immer nur eine Zeile und zwar Realtime Börsen Kurse, bei jedem Neuen Kurs wird die Datei überschrieben. Die Datei sieht dann z.b so aus.

Code: Alles auswählen

1.4034;1.4036
Mit Python Lese ich die Datei aus um z.b ein Handelssystem mit Realtime Kurse zu versorgen. Wenn aber das schreibende Programm gerade schreibt wärend ich Lesen möchte knallt es den Fehler index ist out of Range raus und bricht ab.

Das ist der versuchs Code dazu

Code: Alles auswählen

def TestQwote():
    a = 0
    b = 1
    Bid = 0
    Ask = 0
    lock = "a"
    
    while a != b:
        if os.path.exists(FileName):
            reader = csv.reader(open(FileName, "rb"), delimiter=";")
            for row in reader:
                Bid = float(row[0])
                Ask = float(row[1])
                print Ask
                os.remove(FileName)

                
                
            
TestQwote()
Jetzt hab ich es gerade so versucht das ich das File Einlese und es danach Lösche ,und erst dann erneut Einlese wenn das File wider Existiert. Aber das ist bestimmt nicht die Lösung denke ich.

LG
Zuletzt geändert von sttrader am Donnerstag 31. Mai 2012, 14:36, insgesamt 1-mal geändert.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Wenn die Datei vom Schreiber immer wieder neu angelegt wird, hast Du das Problem, dass die Datei vom Anlegen bis zum Beschreiben leer ist. Da das zwei atomare Vorgänge sind, kann es passieren, dass der lesende Prozess eine leere Datei vorfindet. Werden die CSV-Reihen nun auch noch separat in die Datei geschrieben, wird es schwierig, den richtigen Moment auf Leseseite abzupassen, wenn gerade die Datei fertig geschrieben ist.

Das leer-Problem kannst Du umgehen, in dem Du die Datei öffnest und in einem Rutsch mit os.read() einliest:

Code: Alles auswählen

with open('datei') as f:
    bytes = os.read(f.fileno(), 4096)
Die 4096 müsstest Du so anpassen, dass tatsächlich die ganze Datei komplett gelesen wird. Ist `bytes` leer, war die Datei zum Zeitpunkt des Lesens auch leer. Also wiederholst Du den Leseversuch.

Für das Problem der CSV-Reihen hab ich keine probate Lösung. Was hier evtl. helfen würde, wäre das Wissen um die Anzahl der Einträge, die der Schreiber ausgibt. Dann könntest Du prüfen, ob `bytes` diese auch alle enthält, wenn nicht, hast Du wohl nur einen Teil der Daten vorgefunden und musst entsprechend den Lesevorgang wiederholen.

Edit:
Ein häppchenweises Beschreiben schreit eigentlich nach einem Write-Lock, da Du aber keinen Zugriff auf den Schreiber hast, scheidet das wohl aus.
sttrader
User
Beiträge: 53
Registriert: Dienstag 12. Januar 2010, 11:22
Kontaktdaten:

Hallo

Ich habe das Programm oben von mir seit 2-3 Stunden am Laufen bis her gab es keine weiteren abstürze mehr mal sehen ob es so bleibt.

LG
Antworten