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
Mutex/Lock in WSGI-Anwendung
@glocke: mit dem with-Statement bist Du auf dem richtigen Weg:
Code: Alles auswählen
lock = threading.Lock()
with lock:
# do something
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.
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 LockDasIch hat geschrieben:Du solltest eine Datenbank nutzen.

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.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.