当前位置: 首页 > 面试题库 >

SQLAlchemy的多线程使用

洪高扬
2023-03-14
问题内容

我想制作一个用Python编写并使用SQLAlchemy的数据库应用程序编程接口(或其他任何数据库连接器,如果被告知将SQLAlchemy用于此类任务不是好方法)。该设置是在Linux或BSD上运行的MySQL服务器,以及在Linux或BSD机器(外部或本地)上运行的Python软件。

基本上我想做的是为每个连接生成一个新线程,并且该协议将是自定义且非常简单的,尽管对于每个请求,我想打开一个新事务(或我已阅读的会话),然后我需要提交会议。我现在面临的问题是,来自另一个连接的另一个会话同时发生的可能性很高。

我的问题是该如何处理这种情况?

  • 我是否应该使用锁,以便仅一个会话可以同时运行?
  • 会话实际上是线程安全的吗,我认为它们不是线程安全的吗?
  • 有没有更好的方法来处理这种情况?
  • 穿线的方式不行吗?

问题答案:

会话对象 不是 线程安全的,而是 线程本地的
。从文档:

“该Session对象被完全设计为以 非并发 方式使用,就多线程而言,这意味着“一次仅在一个线程中”
..某些进程需要就位,以免跨多个线程进行多调用实际上获得了同一个会话的句柄。我们将此概念 线程 称为 本地存储 。”

如果您不想自己完成管理线程和会话的工作,SQLAlchemy的ScopedSessionhtml" target="_blank">对象可以为您解决这个问题:

ScopedSession默认情况下,该对象使用threading.local()作为存储,以便Session为所有调用ScopedSession注册表的人维护一个,但仅在单个线程的范围内。在另一个线程中调用注册表的调用者将获得另一个线程本地的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()


 类似资料:
  • 问题内容: 我正在使用这些功能在画布上绘制小圆圈: 这是绘制圆圈的功能: 这个创建画布和圆圈: 我称这些行来运行项目: 什么是执行正确的方法,并在不同的线程? 我已经尝试了以下方法,但无法使其正常工作。: 有人可以告诉我如何运行这些线程吗? 问题答案: 当需要此功能时,您要做的是通过将事件置于线程共享的队列中来安排要执行的事件。这样,在给定线程中,您可以通过排队指定要运行“ create(50,…

  • 我正在画布上用以下函数绘制小圆圈: 这是将绘制圆圈的函数: 这个创造了画布和圆圈: 我调用以下行来运行项目: 在不同的线程中执行和的正确方法是什么? 我尝试了以下方法,但无法使其起作用: 有人能告诉我如何运行这些线程吗?

  • 提前谢谢你

  • 本文向大家介绍C#多线程学习之(四)使用线程池进行多线程的自动管理,包括了C#多线程学习之(四)使用线程池进行多线程的自动管理的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#多线程学习之使用线程池进行多线程的自动管理。分享给大家供大家参考。具体如下: 在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应

  • 问题内容: 我正在努力加快某些过程的执行速度,这些过程将大量记录(大多数是几百万个)发布到Elasticsearch。在我的C#代码中,我已经使用Dataflow实现了一个多线程解决方案,如下所示: 然后我要实现的发送批量请求调用: 我的问题 ,你 是对的实用性存在的数据流管道的一部分的锁内执行额外的线程。 这个可以吗?我可以在性能,执行,缓存/内存丢失等方面看到任何潜在的问题吗? 任何见识都会很

  • typora-copy-images-to: img 1. 多线程概述 人们在日常生活中,很多事情都是可以同时进行的。例如,一个人可以一边听音乐,一边打扫房间,可以一边吃饭,一边看电视。在使用计算机时,很多任务也是可以同时进行的。例如,可以一边浏览网页,一边打印文档,还可以一边聊天,一边复制文件等。计算机这种能够同时完成多项任务的技术,就是多线程技术。Java是支持多线程的语言之一,它内置了对多线