問題
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