Mutex/Lock in WSGI-Anwendung

Django, Flask, Bottle, WSGI, CGI…
Antworten
glocke
User
Beiträge: 66
Registriert: Mittwoch 23. Februar 2011, 21:18

Hi, ich habe eine Bottle-Anwendung und möchte in mehreren Codestücken thread-safe einen Zähler inkrementieren (vereinfachtes Beispiel). Allerdings frage ich mich, ob das Sperren/Entsperren nicht zum Problem wird, wenn der Browser den Seitenaufbau abbricht (vermutlich wird es das^^). Im dümmsten Falle könnte der Thread auf dem Server gerade in der critical section sein. Wie gewährleiste ich, dass der Lock automatisch freigegeben wird? Von C++11 kenne ich std::lock_guard - bzgl. Python habe ich immer mal das with-statement gesehen (z.B. mit File-Handles).

LG Glocke
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@glocke: mit dem with-Statement bist Du auf dem richtigen Weg:

Code: Alles auswählen

lock = threading.Lock()
with lock:
    # do something
glocke
User
Beiträge: 66
Registriert: Mittwoch 23. Februar 2011, 21:18

Ah ok, Danke! :)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du solltest eine Datenbank nutzen. Ein Webserver kann durchaus mehrere Prozesse nutzen (Apache mit mod_wsgi tut dies z.B. per default) oder auch greenlets von denen mehrere in einem Thread laufen würden. All dies sind übliche Konfigurationen und gerade bei Python bietet sich durch den GIL an mehrere Prozesse zu nutzen.
glocke
User
Beiträge: 66
Registriert: Mittwoch 23. Februar 2011, 21:18

DasIch hat geschrieben:Du solltest eine Datenbank nutzen.
Nutze ich auch. Aber so ganz ohne Locks komme ich dann doch nicht aus: Wurde eine Exception geworfen und ich möchte dafür eine Logfile erstellen (oder in eine bestehende Logfile schreiben), sollte ich besser schon erzwingen, dass das ganze Thread-safe ist. Entweder (im Falle der extra Logfile) darf es zu keiner Kollision durch das doppelte Erstellen der Logfile kommen und andererseits (im Falle des Schreibens in eine Logfile) möchte ich beim Schreiben natürlich nicht "durcheinander kommen", d.h. die von den Threads geschriebenen Daten sollten schon in sich zusammenhängend und nicht zusammengemischt sein. Daher Lock :)
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@glocke:
Für so etwas brauchst Du aber eher Datei-Locks.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Genauso wie es fürs speichern von Daten sinnvolle Lösungen gibt, so gibt es auch für Logging Lösungen die man nicht selbst bauen muss oder sollte. Die Standard Library hat z.B. ein logging Modul. Speziell für Exceptions gibt es da übrigens Sentry, was sicherlich sinnvoller ist als Logging was einem Exceptions in irgendwelchen Logdateien versteckt die sich sowieso niemand anschaut. Wenn die eigene Zeit nichts Wert ist kann man Sentry sogar kostenlos selbst hosten.
glocke
User
Beiträge: 66
Registriert: Mittwoch 23. Februar 2011, 21:18

DasIch hat geschrieben:Genauso wie es fürs speichern von Daten sinnvolle Lösungen gibt, so gibt es auch für Logging Lösungen die man nicht selbst bauen muss oder sollte. Die Standard Library hat z.B. ein logging Modul. Speziell für Exceptions gibt es da übrigens Sentry, was sicherlich sinnvoller ist als Logging was einem Exceptions in irgendwelchen Logdateien versteckt die sich sowieso niemand anschaut. Wenn die eigene Zeit nichts Wert ist kann man Sentry sogar kostenlos selbst hosten.
Ich logge dabei nicht direkt die Exceptions, sondern die von Bottle ausgelösten HTTP500 Errors. Aber gute Idee: ich schau mich mal nach fertigen Lösungen um.
Antworten