python - 如何禁用 Flask 中的线程?

标签 python multithreading flask gunicorn

我有以下代码:

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 的线程?

最佳答案

不要直接在 flask 中使用 sqlite3 模块。使用 Flask_sqlalchemy 没有它,我在尝试在 sqlite 上设置数据库时遇到了很多麻烦。一旦我进行了切换,它就变得容易多了。您也可以连接到多种类型的 SQL 数据库!

flask sqlalchemy:

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

确实是 Flask 的最佳指南:

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

关于python - 如何禁用 Flask 中的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52429434/

相关文章:

python - 从 sklearn Python 中的决策树在 pydot 中制作图形

multithreading - 在 OnExecute 事件中使用数据库 (Indy)

python - Python 中处理自定义异常的正确方法是什么?

python - 在 Python 中实现霍纳方法的问题

python - 有没有一个python方法可以将指定元素设置为列表中的某个值?

Java项目在windows和linux下显示不同进程数

c# - 将数据从多个线程发送回主线程的最佳方法是什么?

python - 使用 WTForms model_form() 引发 UserForm has no attribute 'hidden_tag'

python - 来自 HTML 表中相同表单类的多个 WTForm 字段?

python - Flask Social - FACEBOOK_SOCIAL 不接受 request_token_params 参数