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



