ich suche eine Möglichkeit - nach einer Broken Pipe (nehmen wir mal an durch das Abbrechen eines Seite-Ladens) - noch etwas zu tun - z.B. was aufzuräumen. Hintergrund ist, dass (in meinem Browsergame-Projekt) eine DB-Abfrage (Elixir bzw. SQL-Alchemy in Verbindung mit MySQL) bei einer UPDATE-Transaktion das jeweilige Feld vorher sperrt und nach Beendigung des Schreibens wieder entsperrt. Blöderweise passiert es immermal, dass - wenn das Laden der Seite / des Ajax-Requests abgebrochen wird - die Transaktion nicht komplett ist und das jeweilige Feld gesperrt bleibt. Ich habe im Datenbank-Unterforum das Problem bereits formuliert (http://www.python-forum.de/viewtopic.php?f=23&t=29933), allerdings denke ich, dass es eher an bottle liegt (zumindest die Sache mit dem "etwas nach einer Broken Pipe tun").
Oder vereinfacht ausgedrückt folgender Code:
Code: Alles auswählen
from bottle import route, run
from threading import Lock
field_lock = Lock() # sei mal der Lock auf dem zu verwendenden Datenfeld
# Dekorator, um automatisch die Session zu commiten oder zurückzurollen
def managed_transaction(func):
def _managed_transaction(*args, **kw):
try:
res = func(*args, **kw)
print 'Commit!'
except Exception as e:
print 'Rollback!'
return res
return _managed_transaction
# eine "fehlerfreie" Transaktion
@route('/complete/')
@managed_transaction
def complete():
print 'Waiting'
with field_lock:
print 'Locked!'
print 'Accessed' # das wäre der eigentliche Schreib-Zugriff
print 'Unlocked!'
# eine sehr langwierige Transaktion (warum auch immer sie in der Praxis so lange dauern mag)
@route('/incomplete/')
@managed_transaction
def incomplete():
print 'Waiting'
with field_lock:
print 'Locked!'
while True: # das Schreiben verzögert sich (warum auch immer) sehr lange - hier mal extrem als Endlosschleife
pass
print 'Accessed'
print 'Unlocked!'
run()
Code: Alles auswählen
Waiting
Locked!
Accessed
Unlocked!
Commit!
Code: Alles auswählen
Waiting
Locked!
Ich hoffe, ich habe es möglichst verständlich beschrieben
LG Glocke