会话对象不是线程安全的,而是线程本地的。 从文档:
“ 2952092370503903992320对象完全被设计为以非并发方式使用,就多线程而言,这意味着“一次仅在一个线程中” ..需要适当的处理,以使跨多个线程的多重调用不会发生。 实际上无法获得同一个会话的句柄。我们将此概念线程称为本地存储。”
如果您不想自己完成管理线程和会话的工作,SQLAlchemy提供了2952092370503903992320对象来为您解决这个问题:
默认情况下,2952092370503903992320对象使用threading.local()作为存储,以便为所有调用2952092370570503992322注册表的人维护单个Session,但仅在单个线程的范围内。 在另一个线程中调用注册表的调用者将获得另一个线程本地的Session实例。
使用此技术,ScopedSession提供了一种快速且相对简单的方式来在应用程序中提供单个全局对象,该对象可以安全地从多个线程中调用。
请参阅“上下文/本地线程会话”中的示例,以设置自己的线程安全会话:
# set up a scoped_session
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker
session_factory = sessionmaker(bind=some_engine)
Session = scoped_session(session_factory)
# now all calls to Session() will create a thread-local session
some_session = Session()
# you can now use some_session to run multiple queries, etc.
# remember to close it when you're finished!
Session.remove()