问题
tornado中使用sqlalchemy遇到一个问题,接口在并发的时候,sqlalchemy会报各种错误。
解决办法
原因是sqlalchemy用sessionmaker直接建立的session本身就不是线程安全的,怎么保证线程安全呢,一般官方推荐用scoped_session有范围的session,来封装
class scoped_session(object):
def __init__(self, session_factory, scopefunc=None):
self.session_factory = session_factory
if scopefunc:
self.registry = ScopedRegistry(session_factory, scopefunc)
else:
self.registry = ThreadLocalRegistry(session_factory)
def __call__(self, **kw):
if kw:
if self.registry.has():
raise sa_exc.InvalidRequestError(
"Scoped session is already present; "
"no new arguments may be specified."
)
else:
sess = self.session_factory(**kw)
self.registry.set(sess)
return sess
else:
return self.registry()
def r