Flask和mysql多线程_数据库连接池Flask-SQLAlchemy中多线程安全的问题
使用flask-sqlalchemy寫代碼碼到一半,突然想到,Session是否是線程安全的?于是上官方文檔,答案是否!
那問題來了,怎么破?因為它會牽涉到多線程情況下,調用rollback導致的不可預期影響。
官網給了兩個方案:
使用 Contextual/Thread-local Sessions
不用全局的,而是采用函數間傳遞的session變量
明顯,第一種方式對現在代碼的改動最小,擴展性也更好。因為使用的flask-sqlalchemy,于是參考在線文檔 ,發現table的定義與flask-sqlalchemy quickstart的定義不一致。文檔里面有一句有趣的話
a preconfigured scoped session called session
那是否意味著 flask-sqlalchemy 對 sqlachemy 封裝之后,將session做了多線程支持的封裝?看源碼!
classSQLAlchemy(object):
def __init__(self, app=None, use_native_unicode=True, session_options=None, metadata=None):
if session_options isNone:
session_options ={}
session_options.setdefault('scopefunc', connection_stack.__ident_func__)
self.use_native_unicode =use_native_unicode
self.session =self.create_scoped_session(session_options)
self.Model =self.make_declarative_base(metadata)
self.Query =BaseQuery
self._engine_lock =Lock()
self.app =app
_include_sqlalchemy(self)
if app is notNone:
self.init_app(app)
self.session = self.create_scoped_session(session_options)
從這個變量賦值來看,就是scoped_session,為以防萬一,再跟進去看
def create_scoped_session(self, options=None):
"""Helper factory method that creates a scoped session. It
internally calls :meth:`create_session`.
"""
if options isNone:
options ={}
scopefunc = options.pop('scopefunc', None)
returnorm.scoped_session(partial(self.create_session, options),
scopefunc=scopefunc)
把這個代碼與sqlalchemy的官方scope_session例子對比
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker
session_factory = sessionmaker(bind=some_engine)
Session = scoped_session(session_factory)
完全一致!
所以,db.session是線程安全的,并且對sqlalchemy做了非常好的封裝,便捷性更上一層樓,放心用吧!
總結
以上是生活随笔為你收集整理的Flask和mysql多线程_数据库连接池Flask-SQLAlchemy中多线程安全的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: keil编译后生成的M51文件解析
- 下一篇: 加快步伐!腾讯高管:“生成式AI”或纳入