У меня есть следующий бит кода:
import sqlite3
from flask import Flask
app = Flask(__name__)
db = sqlite3.connect('/etc/db.sqlite')
@app.route('/')
def handle():
# run a query and return a response
if __name__ == '__main__':
app.run('0.0.0.0', 8080, debug=True)
Однако, когда я пытаюсь выполнить некоторые операции над объектом базы данных в обработчике запросов, я получаю следующее исключение из sqlite3, потому что это неПотокобезопасная библиотека, и запрос запускается из другого потока, который порождает Flask, а не из основного потока:
sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread.The object was created in thread id 139886422697792 and this is thread id 139886332843776
Я знаю, что «правильный» способ сделать это - использовать функциючтобы создать экземпляр объекта sqlite3.Connection
и сохранить его в глобале Flask g
, как показано здесь: http://flask.pocoo.org/docs/1.0/patterns/sqlite3/. Однако, когда я запускаю это приложение на производстве, я использую gunicorn -w 4 -b 0.0.0.0:8080 app:app
, и там оно работаетхорошо, потому что потоки создаются в начале в этом случае.
Хотя глобальный метод Flask g
работает во всех случаях, я действительно хотел бы избежать накладных расходов на создание и уничтожение sqlite3.Connection
объектов скаждый запрос.Поэтому я хотел бы отключить многопоточность во Flask, чтобы приведенный выше код мог работать без проблем.
Однако даже когда я изменяю последнюю строку вышеуказанного кода на app.run(..., threaded=False)
, я не могу избежатьэта ошибка.Похоже, что Flask все еще создает поток для обработки запросов.
Итак, как я могу отключить многопоточность с помощью Flask?