sqlalchemy多線程使用,threadlocal

問題

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章