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中的连接池是线程安全的吗? 的相关文章

  • 使用 pandas.date_range() 生成多个日期时间,每周两个日期

    我在用着pd date range start date end date freq W MON 每周一生成每周频率日期时间start date 2017 01 01 and end date 2017 12 31 这意味着每月大约生成 4
  • 如何调整 matplotlib 单选按钮的大小和纵横比?

    我已经尝试了几个小时来使简单的单选按钮列表的大小和纵横比正确 但没有成功 首先 导入模块 import matplotlib pyplot as plt from matplotlib widgets import RadioButtons
  • 指示电子邮件的类型

    我有以下自动化程序 它将电子邮件发送给我自己 并添加了特定的链接 import win32com client as win32 import easygui import tkinter as to from tkinter import
  • 从 pyspark.sql 中的列表创建数据框

    我完全陷入了有线的境地 现在我有一个清单li li example data map lambda x get labeled prediction w x collect print li type li 输出就像 0 0 59 0 0
  • 如何获取numpy.random.choice的索引? - Python

    是否可以修改 numpy random choice 函数以使其返回所选元素的索引 基本上 我想创建一个列表并随机选择元素而不进行替换 import numpy as np gt gt gt a 1 4 1 3 3 2 1 4 gt gt
  • 使用 Pytest 的参数化添加测试功能的描述

    当其中一个测试失败时 可以在测试正在测试的内容的参数化中添加描述 快速了解测试失败的原因 有时您不知道测试失败的原因 您必须查看代码 通过每个测试的描述 您就可以知道 例如 pytest mark parametrize num1 num2
  • 调用许多网络服务的最佳方式?

    我有 30 家子公司 每家都实施了他们的 Web 服务 使用不同的技术 我需要实现一个Web服务来聚合它们 例如 所有子公司的Web服务都有一个名为的Web方法GetUserPoint int nationalCode 我需要实现我的网络服
  • 这个等待通知线程语义的真正目的是什么?

    我刚刚遇到一些代码 它使用等待通知构造通过其其他成员方法与类中定义的线程进行通信 有趣的是 获取锁后 同步范围内的所有线程都会在同一锁上进行定时等待 请参见下面的代码片段 随后 在非同步作用域中 线程执行其关键函数 即 做一些有用的事情1
  • python 中的 h2o 框架子集

    如何在 python 中对 h2o 框架进行子集化 如果 x 是一个 df 并且 Origin 是一个变量 那么在 pandas 中我们通常可以通过以下方式进行子集化 x x Origin AAF 但使用 h2o 框架会出现以下错误 H2O
  • 在 Mac OSX 上从 Python 3.6 运行 wine 命令

    我正在尝试用 Python 编写一个打开的脚本wine然后发送代码到wine终端打开一个 exe程序 这 exe程序也是命令驱动的 我可以打开wine 但我无法进一步 import shlex subprocess line usr bin
  • Jupyter 笔记本中未显示绘图图表

    我已经尝试解决这个问题几个小时了 我按照上面的步骤操作情节网站 https plot ly python getting started start plotting online并且图表仍然没有显示在笔记本中 这是我的情节代码 color
  • NumPy 相当于 Keras 函数 utils.to_categorical

    我有一个使用 Keras 进行机器学习的 Python 脚本 我正在构建 X 和 Y 它们分别是特征和标签 标签的构建方式如下 def main depth 10 nclass 101 skip True output True video
  • 将字符串中的随机字符转换为大写

    我尝试随机附加文本字符串 这样就不只是有像这样的输出 gt gt gt david 我最终会得到类似的东西 gt gt gt DaViD gt gt gt dAviD 我现在的代码是这样的 import random import stri
  • 使用单独的线程在java中读取和写入文件

    我创建了两个线程并修改了 run 函数 以便一个线程读取一行 另一个线程将同一行写入新文件 这种情况会发生直到整个文件被复制为止 我遇到的问题是 即使我使用变量来控制线程一一执行 但线程的执行仍然不均匀 即一个线程执行多次 然后控制权转移
  • Python守护进程:保持日志记录

    我有一个将一些数据记录到磁盘的脚本 logging basicConfig filename davis debug log level logging DEBUG logging basicConfig filename davis er
  • 当底层连接是有状态时如何使用 Apache HttpClient?

    我在谷歌上搜索了很多关于如何使用 HttpClient 进行多线程处理的信息 他们中的大多数人建议使用 ThreadSafeClientConnManager 但我的应用程序必须登录某个主机 登录表单页面 以便 HttpClient 获得底
  • PyQt5:如何使QThread返回数据到主线程

    I am a PyQt 5 4 1 1初学者 我的Python是3 4 3 这是我尝试遵循的many https mayaposch wordpress com 2011 11 01 how to really truly use qthr
  • 如何在 scikit 中加载 CSV 数据并将其用于朴素贝叶斯分类

    尝试加载自定义数据以在 Scikit 中执行 NB 分类 需要帮助将示例数据加载到 Scikit 中 然后执行 NB 如何加载目标的分类值 使用相同的数据进行训练和测试 或使用完整的数据集进行测试 Sl No Member ID Membe
  • 描述符“join”需要“unicode”对象,但收到“str”

    代码改编自here http wiki geany org howtos convert camelcase from foo bar to Foo Bar def lower case underscore to camel case s
  • 使用 paramiko 运行 Sudo 命令

    我正在尝试执行sudo使用 python paramiko 在远程计算机上运行命令 我尝试了这段代码 import paramiko ssh paramiko SSHClient ssh set missing host key polic

随机推荐

  • 如何在 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 连接是 表示为文件描述符 通常跨进程工作 边界 这意味着这将导致对文件的并发访问