sqlalchemy中的连接池是线程安全的吗?

2023-11-25

文档称连接池也不是为多线程设计的:

至关重要的是,当使用连接池时,以及扩展时 使用通过 create_engine() 创建的引擎, 连接不会与分叉进程共享。 TCP 连接是 表示为文件描述符,通常跨进程工作 边界,这意味着这将导致对文件的并发访问 描述符代表两个或多个完全独立的Python 口译员指出。

据我了解,如果我创建连接池:

self.engine = create_engine('postgresql://{user}:{password}@{host}:{port}/{db}'.format(
    user=Configuration().get(section='repository', option='user'),
    password=Configuration().get(section='repository', option='password'),
    host=Configuration().get(section='repository', option='host'),
    port=Configuration().get(section='repository', option='port'),
    db=Configuration().get(section='repository', option='database')
), echo=False, pool_size=3)

self.session = sessionmaker(self.engine, expire_on_commit=False)

然后打电话self.session()在不同的线程中,我将有 3 个不同的连接,它们在 N 个不同的线程中使用。 这是否意味着只有 3 个并发线程会执行某些工作,而其他线程将等待一个或多个线程调用session.close()?或者有可能 >2 个线程同时使用同一个连接?

NullPool 是否更安全(因为每个新会话都是一个新连接)?

self.engine = create_engine('postgresql://{user}:{password}@{host}:{port}/{db}'.format(
            user=Configuration().get(section='repository', option='user'),
            password=Configuration().get(section='repository', option='password'),
            host=Configuration().get(section='repository', option='host'),
            port=Configuration().get(section='repository', option='port'),
            db=Configuration().get(section='repository', option='database')
        ), echo=False, poolclass=NullPool)

一般问题:在这种情况下使用相同的连接池是否可以:

engine = create_engine('connection_string', echo=False, pool_size=3)
Session = sessionmaker(engine)

def some_function():
    session = Session()
    ...

pool = Pool(processes=10)
pool.map(some_function)
pool.close()
pool.join()

总而言之,线程和进程之间似乎是混合的。该问题首先询问 SQLAlchemy 连接池是否是线程安全的,但以使用以下代码示例结束multiprocessing。对“一般问题”的简短回答是:不,如果使用分叉,则不应在进程边界上共享引擎及其关联的连接池。但也有例外。

池实现本身是线程安全的,并且通过代理Engine也是线程安全的,因为引擎除了保留对池的引用之外,不保留状态。另一方面,从池中签出的连接是not线程安全, and 两者都不是Session.

文档称连接池也不是为多线程设计的:

有一点误读,因为文档中的原始引用是关于共享连接池的process边界(如果使用分叉)。这可能会导致麻烦,因为在 SQLAlchemy 和 DB-API 层下面通常有一个 TCP/IP 套接字或文件句柄,而这些不应该同时操作。

在这种特殊情况下使用NullPool会是安全的,而其他的则不然,因为它根本不池化,因此连接不会在进程之间共享,除非有人不遗余力地这样做。

这是否意味着只有3个并发thread将执行一些工作,而其他工作将等待一个或多个线程调用session.close()?

假设一个QueuePool在使用中,设置的大小不是硬性限制,并且有一定的溢出空间。大小决定了池中持久保留的连接数。如果达到溢出限制,调用将等待timeout放弃并提出之前的几秒钟TimeoutError,如果没有可用的连接。

或者有可能 >2threads会同时使用同一个连接吗?

两个或更多threads将无法意外地从池中检出相同的连接,除了StaticPool,但可以在之后在线程之间显式共享它(不要)。


到底,“使用引擎和连接 - 基本用法”涵盖了问题的主要部分:

单个Engine代表进程管理许多单独的 DBAPI 连接,并且旨在以并发方式调用[强调]。

...

对于使用的多进程应用程序os.fork系统调用,或者例如Pythonmultiprocessing模块,通常需要一个单独的Engine用于每个子进程。这是因为Engine维护对连接池的引用,该连接池最终引用 DBAPI 连接 - 这些连接往往不可跨进程边界移植。一个Engine配置为不使用池化(这是通过使用NullPool)没有这个要求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sqlalchemy中的连接池是线程安全的吗? 的相关文章

  • 类的 IPython 表示

    我正在使用我创建的模块尝试 IPython 但它没有显示类对象的实际表示 相反 它显示类似的内容 TheClass module TheClass name I heavily在这个模块中使用元类 我有真正有意义的类表示 应该向用户显示 是
  • 让 VoiceChannel.members 和 Guild.members 返回完整列表的问题

    每当我尝试使用 VoiceChannel members 或 Guild members 时 它都不会提供适用成员的完整列表 我从文本命令的上下文中获取 VoiceChannel 和 Guild 如下所示 bot command name
  • 计算另一个字符串中多个字符串的出现次数

    在 Python 2 7 中 给定以下字符串 Spot是一只棕色的狗 斑点有棕色的头发 斑点的头发是棕色的 查找字符串中 Spot brown 和 hair 总数的最佳方法是什么 在示例中 它将返回 8 我正在寻找类似的东西string c
  • 在 Python 中将列表元素作为单独的项目返回

    Stackoverflow 的朋友们大家好 我有一个计算列表的函数 我想单独返回列表的每个元素 如下所示 接收此返回的函数旨在处理未定义数量的参数 def foo my list 1 2 3 4 return 1 2 3 4 列表中的元素数
  • NLTK 2.0分类器批量分类器方法

    当我运行此代码时 它会抛出一个错误 我认为这是由于 NLTK 3 0 中不存在batch classify 方法 我很好奇如何解决旧版本中的某些内容在新版本中消失的此类问题 def accuracy classifier gold resu
  • Tensorboard SyntaxError:语法无效

    当我尝试制作张量板时 出现语法错误 尽管开源代码我还是无法理解 我尝试搜索张量板的代码 但不清楚 即使我不擅长Python 我这样写路径C Users jh902 Documents logs因为我正在使用 Windows 10 但我不确定
  • GUI(输入和输出矩阵)?

    我需要创建一个 GUI 将数据输入到矩阵或表格中并读取此表单数据 完美的解决方案是限制输入表单仅允许float 例如 A 1 02 0 25 0 30 0 515 0 41 1 13 0 15 1 555 0 25 0 14 1 21 2
  • 打印包含字符串和其他 2 个变量的变量

    var a 8 var b 3 var c hello my name is var a and var b bye print var c 当我运行程序时 var c 会像这样打印出来 hello my name is 8 and 3 b
  • Python 内置的 super() 是否违反了 DRY?

    显然这是有原因的 但我没有足够的经验来认识到这一点 这是Python中给出的例子docs http docs python org 2 library functions html super class C B def method se
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 如何将 GAE 中一种 Kind 中的所有实体复制到另一种 Kind 中,而无需显式调用每个属性

    我们如何使用function clone entity 如中所述在 Python 中复制 Google App Engine 数据存储中的实体 而无需在 编译 时知道属性名称 https stackoverflow com question
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • Protobuf 如何编码 oneof 消息结构

    对于这个 python 程序 在编码时运行 protobuf 编码会给出以下输出 0a 10 08 7f8a 0104 08 02 10 0392 0104 08 02 10 03 18 01 我不明白的是为什么8a后面有一个01 为什么9
  • 在 Google App Engine 中,如何避免创建具有相同属性的重复实体?

    我正在尝试添加一个事务 以避免创建具有相同属性的两个实体 在我的应用程序中 每次看到新的 Google 用户登录时 我都会创建一个新的播放器 当新的 Google 用户在几毫秒内进行多个 json 调用时 我当前的实现偶尔会创建重复的播放器
  • Android 中的处理程序与异步调用

    目前我正在使用处理程序来调用 Web 服务方法以使其在后台运行 问题是它需要更多的时间来给出响应 在性能方面似乎更昂贵 现在我计划使用异步调用 哪一个是最好的 Android 中的处理程序和异步调用有什么区别 请帮我想出一个最好的解决方案
  • python 中的“槽包装器”是什么?

    object dict 和其他地方的隐藏方法设置为这样的
  • 每当使用 import cv2 时 OpenCV 都会出错

    我在终端上使用 pip3 install opencv contrib python 安装了 cv2 并且它工作了 但是每当我尝试导入 cv2 或运行导入了 cv2 的 vscode 文件时 在 python IDLE 上它都会说 Trac
  • 重新分配唯一值 - pandas DataFrame

    我在尝试着assign unique值在pandas df给特定的个人 For the df below Area and Place 会一起弥补unique不同的价值观jobs 这些值将分配给个人 总体目标是使用尽可能少的个人 诀窍在于这
  • 根据 Pandas 中的列表选择数据框行的子集

    我有一个数据框df1并列出x In 22 import pandas as pd In 23 df1 pd DataFrame C range 5 B range 10 20 2 A list abcde In 24 df1 Out 24
  • 如何在 Flask 中的视图函数/会话之间传递复杂对象

    我正在编写一个 Web 应用程序 当 且仅当 用户登录时 该应用程序从第三方服务器接收大量数据 这些数据被解析为自定义对象并存储在list 现在 用户在应用程序中使用这些数据 调用不同的视图 例如发送不同的请求 我不确定什么是最好的模式在视

随机推荐

  • 如何在 PHP 中不使用 ord() 将字符串转换为 ASCII 值?

    我正在寻找将字符串 Hello world 转换为 php 中的 ASCII 值 但我不想使用ord 是否有其他解决方案可以在不使用的情况下打印 ascii 值ord unpack 根据给定的格式从二进制字符串解包到数组中 Use the
  • PHP cURL multi_exec 请求之间的延迟

    如果我运行标准 cURL multi exec 函数 下面的示例 我会立即获得请求的所有 cURL 句柄 我想在每个请求之间设置 100 毫秒的延迟 有办法做到这一点吗 在 Google 和 StackOverflow 搜索中未找到任何内容
  • 在 VsCode 中激活 Anaconda 环境

    我的系统上有 Anaconda VsCode 也在工作 但是如何让 VsCode 在运行 python 脚本时激活特定环境 只需使用 cmd shift P ctrl shift P for MS Windows Search 选择口译员
  • 使用强化学习解决分类问题[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我可以在分类上使用强化学习吗 比如人类活动识别 如何 反馈有两种类型 一是评价性的用于强化学习方法 第二个是有指导意义的用于监督学习 主要用于分类问题 当使用监督学习时 神经网络的权
  • 有没有办法在seaborn点图中设置透明度/alpha级别?

    我想制作一个具有透明度的seaborn点图 以便我可以清楚地看到位于其他不同颜色后面的点 我尝试将 alpha 0 3 添加到对 pointplot 的调用中 并在带有 kind point 的 catplot 中尝试了相同的操作 然而 这
  • 为什么嵌套迭代器闭包不会从外部作用域复制值

    我正在尝试使用嵌套迭代器 其中内部迭代器使用外部迭代器的值 vec 0 10 iter flat map a 0 10 map b a b error a活得不够长 0 10 map b 注意 引用必须对方法调用有效 如果我移动内部闭包 m
  • JQuery Datepicker 不会使用英国日期字符串发布

    如果问题很明显 我深表歉意 但我不明白为什么它突然不起作用 我有一个jquery日期选择器 从我记事起它就一直工作正常 但是突然间 当我尝试提交表单时 日期选择器上的日期选择器重新出现 就好像我提交的日期无效一样 我已经使用以下代码行将日期
  • 自动刷新 IFrame HTML

    如何每 3 秒自动刷新一次 Iframe 而不刷新整个页面 我用但它会显示整个页面刷新 并且每次都会将您带到页面顶部 我的 Iframe 指向一个文本文件来读取我放入的实时消息 有没有一种方法可以做到这一点 而无需刷新整个页面 仅刷新元素
  • 参考:使用 MySQL 扩展的完美代码示例是什么? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 这是为了创建一个社区学习资源 我们的目标是提供良好的代码示例 这些代码不会重复复制 粘贴
  • Java继承

    因此 我一直在尝试找到正确的方法来让应该非常简单的继承发挥作用 按照我想要的方式 但我惨败了 考虑一下 class Parent public String name Parent public Parent public void doS
  • ASP.Net Identity 和 IdentityServer4 声明

    我使用 IdentityServer4 作为 OIDC 提供程序和 ASP NET Core 2 0 我已经阅读了几篇文章 以确保 IdentityServer 发出的声明最终出现在 ClaimsPrincipal 即 Auth Cooki
  • 如何查找数组中出现次数最多的项目[重复]

    这个问题在这里已经有答案了 如何找到数组中出现次数最多的项 1 1 1 2 3 mode gt 1 cat dog snake dog mode gt dog 首先构建一个哈希 将数组中的每个值映射到其频率 arr 1 1 1 2 3 fr
  • PyDev 和 Eclipse 未解决的导入问题

    尽管我已经多次使用 Eclipse for Java 但我对 PyDev 和 Python 还很陌生 我正在尝试解决一些 Dive Into Python 示例 这感觉像是一个极其微不足道的问题 但现在却变得非常烦人 我使用的是 Ubunt
  • 使用 method_add 动态覆盖实例方法了解 ruby​​ 元编程

    我有以下来自 Programming Ruby 1 9 的代码 稍作修改 我只是想确保我的思维过程是准确的 module Trace def self included culprit Inject existing methods wit
  • (276/304)*304 的小数舍入关闭

    如果将以下代码放入编译器中 结果会有点奇怪 decimal x 276 304 304 double y 276 304 304 Console WriteLine decimal x x Console WriteLine double
  • Apache 应该服务什么,Tomcat 应该服务什么?

    我正在尝试在 Tomcat 之前设置 Apache Apache 提供什么服务 我知道 Apache 对于静态页面和图像效果更好 我目前在 Tomcat 中部署了一个 war 文件 其中包含静态页面 图像和 Flash 文件 我应该把这些都
  • ASP.NET 托管环境/shadowCopyBinAssemblies

    今天我偶然发现了ShadowCopyBinAssemblies选项中的托管环境 tag 显然这个属性是网络配置 system web 配置布尔选项 指示 Bin 目录中应用程序的程序集是否卷影复制到应用程序的 ASP NET 临时文件目录
  • 未添加本机代码的 Java 致命错误 SIGSEGV

    我从 Java 编译器收到一条我不理解的错误消息 我已经使用 Java 6 和 7 在 OSX 10 6 10 9 和 Ubuntu 14 04 上测试了我的代码 当我使用 Eclipse 调试器或解释器 使用 Xint 选项 运行时 一切
  • Django 无法迁移 PostgreSQL:关系 Y 的约束 X 不存在

    我正在尝试在 PostgreSQL 9 6 5 数据库上运行 Django 1 11 迁移 但出现了奇怪的错误 Applying myapp 0011 auto 20171130 1807 Traceback most recent cal
  • sqlalchemy中的连接池是线程安全的吗?

    文档称连接池也不是为多线程设计的 至关重要的是 当使用连接池时 以及扩展时 使用通过 create engine 创建的引擎 连接不会与分叉进程共享 TCP 连接是 表示为文件描述符 通常跨进程工作 边界 这意味着这将导致对文件的并发访问