Seite 1 von 1

Mutex/Lock in WSGI-Anwendung

Verfasst: Dienstag 9. Juni 2015, 07:36
von glocke
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

Re: Mutex/Lock in WSGI-Anwendung

Verfasst: Dienstag 9. Juni 2015, 07:40
von Sirius3
@glocke: mit dem with-Statement bist Du auf dem richtigen Weg:

Code: Alles auswählen

lock = threading.Lock()
with lock:
    # do something

Re: Mutex/Lock in WSGI-Anwendung

Verfasst: Dienstag 9. Juni 2015, 07:45
von glocke
Ah ok, Danke! :)

Re: Mutex/Lock in WSGI-Anwendung

Verfasst: Dienstag 9. Juni 2015, 14:39
von DasIch
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.

Re: Mutex/Lock in WSGI-Anwendung

Verfasst: Dienstag 9. Juni 2015, 18:24
von glocke
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 :)

Re: Mutex/Lock in WSGI-Anwendung

Verfasst: Dienstag 9. Juni 2015, 19:26
von jerch
@glocke:
Für so etwas brauchst Du aber eher Datei-Locks.

Re: Mutex/Lock in WSGI-Anwendung

Verfasst: Mittwoch 10. Juni 2015, 02:12
von DasIch
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.

Re: Mutex/Lock in WSGI-Anwendung

Verfasst: Mittwoch 10. Juni 2015, 09:20
von glocke
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.