Как я могу отключить многопоточность во Flask? - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть следующий бит кода:

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?

1 Ответ

0 голосов
/ 20 сентября 2018

Не используйте модуль sqlite3 непосредственно в колбе.Использование Flask_sqlalchemy У меня было много проблем при попытке настроить базы данных на sqlite без него.Как только я сделал переключение, это было оооочень намного легче.Вы также можете подключаться к нескольким типам баз данных SQL!

Flask sqlalchemy:

http://flask -sqlalchemy.pocoo.org / 2.3 /

Действительно лучший гид для фляги там:

https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...