F(ile) Locking

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
RicmanX
User
Beiträge: 69
Registriert: Donnerstag 29. August 2002, 17:10
Wohnort: Erfurt
Kontaktdaten:

Wie kann ich eine Datei kurzzeitig für neue Zugriffe sperren?

Fall: Jemand trägt sich in in Gästebuch ein, dass Dateibasiert ist. Würden sich "gleichzeitig" Leute eintragen, ginge die Datei kaputt bzw. hätte Fehler. Wie kann ich also die Datei sperren, wenn schon ein User darauf zugreift, sprich es wird etwas hineingeschrieben. Im Prinzip soll der 2. User dann ne Sekunde warten und dann seine Aktionen an der Datei ausgeführt werden.

Bitte vorallem Beispiele und nicht nur Links zu den Modulen :D
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!

Bisschen dünne Informationsdecke. Ich nehme mal an, dass es um CGI geht (dann sollte der Thread aber ins richtige Forum verschoben werden).
Mein Vorschlag (hab' nur wenig CGI-Erfahrung): Jeder neue Gästebucheintrag sollte im 1. Schritt in eine einzelne Temp-Datei geschrieben werden. Das geht schnell und der Gast bekommt sofort eine Antwort a la "Besten Dank! Ihr Eintrag erscheint ASAP im Gästebuch". Und im 2. Schritt sollte dann ein unabhängiger Prozess (regelmäßig oder auf Anforderung) die aufgelaufenden Temp-Dateien in die Gästebuchdatei schreiben.

Jan
akIra
User
Beiträge: 49
Registriert: Dienstag 3. Dezember 2002, 12:05
Wohnort: Berlin
Kontaktdaten:

Du könntest dir doch einfach ein IsOpen-Flag setzen oder ?

Code: Alles auswählen

IsOpen = 0

def GB_Input():
    xy
    IsOpen=0

if IsOpen:
    '''geöffnet'''
else:
    IsOpen = 1
    GB_Input()
währe jetzt die einfachste Lösung, die mir einfallen würde.

Die Datei nach dem Öffnen, nicht ein 2-mal öffnen zu können geht sicher auch.

Ciao,
akI
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi akIra,

im Pythoncookbook habe ich einen Lösungsansatz gefunden.
http://aspn.activestate.com/ASPN/Cookbo ... cipe/65203

@Voges:
dies ist kein CGI-Spezifisches Problem, mich wundert, daß Python dafür kein eigenes systemunabhängiges Modul hat bzw die Filelocks nicht implizit beim öffnen setzt.


Gruß

Dookie
RicmanX
User
Beiträge: 69
Registriert: Donnerstag 29. August 2002, 17:10
Wohnort: Erfurt
Kontaktdaten:

@akira: das wird nichts nutzen, da in meinem Fall das Script ja von 2 Usern je "runtergeladen" wird und dann laufen diese parallel. D.h. wenn IsOpen beim 1. User 1 ist, bekommt das Script es beim 2. User nicht mit.
Man kann es also nur durch Beeinflussung der Datei etwas erreichen.

@Dookie: sieht auf den ersten Blick gut aus, nur geht das nur bei NT und Posix(?), oder was bedeutet das mit den Betriebssystemen?
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Also versuchen wir's doch mal traditionell. Die Idee von Voges, das ganze erst in einer temp - Datei zwischenzuspeichern ist doch garnicht so schlecht.

Bieten sich doch zwei Modelle an:

1. Ich habe Zugriff auf den Server und kann einen cron - job ausführen lassen (bei Windows heißt das glaube ich Tasks)

Der User erzeugt seine temporäre Datei und eine gleichnamige mit der Endung .lck Sobald diese verschwunden ist, hängt cron die Datei an die bestehende Datei an und löscht die temporäre Datei.

2. Ich habe keinen Zugriff auf den Server

zuerst wieder die temporäre Datei erzeugen. Wenn eine .lck Datei besteht, muß so lange gewartet werden, bis diese verschwunden ist. Dann eine .lck Datei erzeugen, die Datei anhängen und die .lck Datei löschen.

nur was passiert, wenn der User beim speichern abschmiert oder den OFF Knopf drückt. Dann ist keiner mehr da, der die .lck löscht. Da muß z. B. eine Löschberechtigung für überalterte .lck Dateien eingefügt werden.

Is ja nicht kompliziert aber auch nicht mal eben gemacht.

Hans
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi RicmanX,

das Modul ist für NT und Linux/Unix.
Falls es eine CGI-Aufgabe ist, machs mit php, da gibts filelocking.


Gruß

Dookie
RicmanX
User
Beiträge: 69
Registriert: Donnerstag 29. August 2002, 17:10
Wohnort: Erfurt
Kontaktdaten:

Ich will's ja grade mit Python machen, da man es ja immerwieder braucht :D Hmm... aber ich denk mal Linux und NT sollten ausreichen.
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

hab mir mal die zeit genommen das zu testen. wenn ich es unter posix ausführe gibt es keinerlei probleme... nur wenn ich es unter windows ausführe, findet er bei mir die drei Module win32con, win32file, pywintypes nicht. hat die jemand von euch trotzdem? ansonsten muss ich mich noch mal umsehen... :? :wink:
Gast

Morgen!

Wird daran liegen, dass Dir die "Windows Extensions" fehlen. Bei der Python-Version von Activestate sind die automatisch dabei, bei der Version von Pyhton.org anscheinend nicht. Runterladen kannst Du sie Dir hier:
http://starship.python.net/crew/mhammon ... loads.html

[nörgel]Grrr, muss diese Kleinschreibung sein? :|[/nörgel]

Jan
[/url]
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Anonymous hat geschrieben:Morgen!
Der Beitrag war (natürlich) von mir. Langsam geht mir diese Forumssoftware auf den Keks :twisted:

Jan (Voges - falls es wider nicht klappt)
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Ich habe noch mal bei www.python.org gestöbert. Habe nur den Hinweis gefunden, dass es mit dem Modul fcntl geht. Gibts aber nur für UNIXE.

Auch für UNIXE gibt's das Modul posixfile in der auch eine Methode lock() implementiert ist. Da habe ich aber auch einen Hinweis gefunden, dass diese Methode in naher Zukunft obsolete werden soll.

Für Windows und Mac war nix zu finden.

Hans
Antworten