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做了非常好的封装,便捷性更上一层楼,放心用吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值