Я заметил, что SQLite db.commit()
(сохранение на диск) занимает от 50 до 100 мсек с моей небольшой базой данных. Это нормально и задокументировано здесь , но это слишком много, чтобы делать это после каждого запроса клиента / после каждого INSERT вот так:
import bottle, sqlite3, random
@bottle.route('/')
def index():
c = db.cursor()
c.execute('INSERT INTO test VALUES (?)', (random.randint(0, 10000)))
c.close()
db.commit() # should we do it here? (100ms is too much after *each* request!)
return 'hello'
def worker():
db.commit() # or here? how to call this worker once every 10 seconds?
db = sqlite3.connect('test.db')
db.execute("CREATE TABLE IF NOT EXISTS test (a int)")
bottle.run(port=80)
Точнее Я не хочу терять 100 мс после каждого запроса: я оптимизировал свой сервер для очень быстрого обслуживания страниц (10 мс), и было бы стыдно потерять 100 мс из-за фиксации БД.
Конечно, я мог запускать новый поток для вызова worker()
только раз в 10 секунд (в худшем случае, если приложение выйдет из строя, будут потеряны только 10 последних секунд БД). Но я читал, что в этом контексте не рекомендуется использовать потоков .
Вопрос: как выполнять фиксацию SQLite DB только раз в несколько секунд (вместо одного раза после каждого INSERT) in a Bottle / Flask контекст веб-сервера?