У меня постоянно работает приложение (запущено в Linux с screen -S myapp python3 app.py
, а затем я отключаю его). Это может быть приложение Bottle, приложение Flask или любая другая система, включающая вечно выполняющееся событие l oop:
import anyframework # can be bottle, flask or anything else
import sqlite3
@route('/')
def index():
c = db.cursor()
c.execute('INSERT INTO test VALUES (?)', ('test',))
c.close() # we can't commit here for *each* client request, it would eat 100ms for each request
return 'hello'
@route('/makeitcrash')
def index():
sdlfksdfs # this will generate an error
def cleanup():
db.commit()
db = sqlite3.connect('test.db')
run()
Как надежно убедиться, что cleanup()
(и, следовательно, фиксация БД) вызывается во всех возможных случаях завершения работы сервера? то есть:
если сервер убит с помощью SIGKILL, SIGTERM
, если код сервера содержит ошибку (например, если посещается http://example.com/makeitcrash)
если я делаю CTRL + C в терминале (внутри запущенного screen
)
?
Я собирался использовать atexit
и добавить try: except:
везде, но я думаю, что это приведет к дублированию кода, чтобы вставить try: except:
для каждого маршрута.
Каково общее решение этой проблемы?