python 中多线程应用程序中的分段错误

2023-12-01

我在 python 中有一个多线程应用程序,其中我创建了多个生产者线程,它们从数据库中提取数据。数据以块的形式提取。因此,线程创建具有限制值的sql语句的部分被保留在锁内。为了让线程同时执行查询,query()函数被保留在锁之外。然后结果获取部分再次被锁住。下面是代码片段:

with UserAgent.lock:
    sqlGeoTarget = "call sp_ax_ari_select_user_agent_list('0'," + str(self.chunkStart) + "," + str(self.chunkSize) + ",1);"
    self.chunkStart += self.chunkSize

self.dbObj.query(sqlGeoTarget)
print "query executed. Processing data now..."+sqlGeoTarget

with UserAgent.lock:
    result = self.dbObj.fetchAll()
    self.dbObj.dbCursor.close()

但是这段代码会产生致命错误segmentation fault (core dumped)。因为如果我把所有代码都加锁,它就可以正常执行。我在获取数据后显式关闭游标,当再次触发 query() 函数时它会重新打开。

这段代码位于一个名为UserAgent它是一个名为的类的共享资源Producer。因此,数据库对象是共享的。所以问题区域 99% 一定是因为数据库对象是共享的,同时点击查询并关闭游标,那么一定会弄乱结果集。那么如何解决这个问题并实现并发数据库查询执行呢?


不要跨线程重用连接。相反,为每个线程创建一个新连接。

来自 MySQLdb 用户指南:

MySQL 协议无法同时处理使用同一连接的多个线程。 MySQLdb 的一些早期版本利用锁定来实现 2 的线程安全性。虽然使用标准 Cursor 类(它使用mysql_store_result()),SSCursor(它使用mysql_use_result();对于后者,您必须确保在执行另一个查询之前已读取所有行。添加事务使情况变得更加复杂,因为事务在游标执行查询时开始,但在游标执行查询时结束COMMIT or ROLLBACK由Connection对象执行。除了在查询执行期间无法共享连接之外,两个线程在事务正在进行时根本无法共享连接。这使得代码过于复杂,以至于不值得。

总体结果是:不要在线程之间共享连接。这确实不值得你或我的努力,并且最终可能会损害性能,因为 MySQL 服务器为每个连接运行一个单独的线程。您当然可以执行诸如在池中缓存连接之类的操作,并一次将这些连接提供给一个线程。如果你让两个线程同时使用一个连接,MySQL 客户端库可能会崩溃并死掉。你被警告了。

强调我的。

Use 线程本地存储 or a 专用连接池库反而。

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

python 中多线程应用程序中的分段错误 的相关文章

随机推荐

  • 空白第一个 UITableView 节标题

    我的 UITableView 有 2 个部分 我希望我的第一个标题不存在 没有空间 什么都没有 第一个单元格接触屏幕顶部 我想要为我的第二部分添加一个自定义部分标题 如果我不使用我可以这样做 UIView tableView UITable
  • R Hessian 矩阵

    我需要创建函数的 Hessian 矩阵 如下所示 func lt expression sin x y cos x y vars lt c x y 我也需要二阶导数作为表达式 并且需要多次计算它们 所以我制作了一个一阶导数列表和一个二阶导数
  • git 更新后脚本不起作用

    编辑我的后老问题有几次 我提出了一个新问题 因为现在这是一个新问题 In git hooks post update I have echo a gt gt home pi log git update server info git st
  • XML:处理大数据

    您推荐哪种 XML 解析器用于以下目的 XML 文件 已格式化 包含空格 大约 800 MB 它主要包含三种类型的标签 我们称它们为 n w 和 r 它们有一个名为 id 的属性 我必须尽快搜索该属性 删除我不需要的属性可以节省大约 30
  • 如何使用 Firebase 客户端通过多个客户端连接(Node.JS 客户端库)连接到 Nest API?

    我正在构建一个需要处理多个用户的中央模块 让他们订阅其巢上的数据更改 根据我的搜索 Node JS 库不允许我与 Google Nest API 进行多个 Firebase 连接 在不使用 REST 或 REST 流式传输的情况下 是否有任
  • ObjectSet.AddObject() 与 EntityCollection.Add()

    假设我有两个实体集 团队 和 玩家 我正在向系统添加新团队 为了便于讨论 假设我从一个文件 包含重复项 中添加一千个团队 该系统包含 100 个团队来启动 我的目标是避免重复 而不为每个添加的团队调用 SaveChanges 流程是查询新的
  • AJAX跨域调用

    我了解AJAX跨域策略 所以我不能只是打电话 http www google com 通过 ajax HTTP 请求并显示 结果在我的网站上的某个地方 我尝试使用 dataType jsonp 这实际上可以工作 但我收到语法错误 显然是因为
  • python 深拷贝和浅拷贝并传递引用

    关于python深拷贝和浅拷贝的问题 该帖子位于深拷贝和浅拷贝有什么区别 帮不了我 为什么例如1的和是6而不是10 e g 1 kvps 1 1 2 2 theCopy kvps copy both point to the same me
  • 获取 pandas 数据框中两个日期时间列的差异[重复]

    这个问题在这里已经有答案了 我有一个数据框 它显示的类型为 signup time 151112 non null datetime64 ns purchase time 151112 non null datetime64 ns 实际值的
  • 通用Windows平台和Live SDK

    我有个问题 我最近在我的计算机上安装了 VS 2015 和 Windows 10 拥有通用应用程序真是太棒了 我计划在 UWP 上转换我的一些程序 但我有一个问题 在我的一个程序中 我允许用户将其数据保存在 OneDrive 上 如果 On
  • 如何将 stringVar() 从 tk 转换为 pyqt

    我有这个函数作为我的代码的一部分 我正在尝试从 tk 迁移到 pyqt 但我在 pyqt 方面没有太多经验 我正在尝试生成 Tkinter 字符串变量列表来存储条目 def generate stringvars self temp ent
  • PHP date() 函数没有给出正确的时间

    我试图找出为什么 php date 给我错误的时间 将实际时间设置为 2 小时 这给出了 2011 01 01 03 14 04 而不是 2011 01 01 05 14 04 小时减少 2 我没有更改 date 的时区 当用户访问该网站时
  • 如何从 dict 中获取值列表?

    如何获取 Python 字典中的值列表 在 Java 中 以列表形式获取 Map 的值就像执行以下操作一样简单list map values 我想知道 Python 中是否有一种类似的简单方法可以从字典中获取值列表 dict values返
  • 指向整数数组的指针与指向整数的双指针

    我本以为整数数组是指向整数的指针类型 因此这意味着指向整数数组的指针是指向整数的双指针类型 但我得到的结果却表明事实并非如此 我怀疑整数数组类型不是指向整数的指针类型 这是我的例子 int main int p 3 1 2 3 int pt
  • 迭代时从哈希集中删除元素[重复]

    这个问题在这里已经有答案了 所以 如果我尝试从 Java 中删除元素HashSet迭代时 我得到并发修改异常 从数组中删除元素子集的最佳方法是什么HashSet就像下面的例子一样 Set
  • 在云功能中,我如何从另一个集合加入以获取数据?

    我正在使用云功能向移动设备发送通知 我在 Firestore 中有两个集合clientDetail and clientPersonalDetail 我有clientID两个集合中相同 但日期存储在clientDetail名称存储在 cli
  • Oracle SQL:如何显示空周/没有数据的周?

    如同这个问题 但我的数据集还有一个包含许多 ID 的附加列 每个 ID 都有一个按恒定时间范围回溯的数据集 并且某些周可能会丢失数据 我想填写丢失周的值 例如 我想要这个 ID WEEKEND DAY VALUE A00 2012 01 0
  • Android USBHost 模式 - 为什么我的 IRDA 设备在 ClaimInterface 上失败?

    我的 Xperia Neo Cyanogen Mod 9 连接了一个 Lindy IRDA USB 桥接器 我已经更改了功能以支持主机模式等 代码中一切看起来都很好 我检测到该设备 我可以看到接口和两个端点 一进一出 但是一旦我尝试声明接口
  • 列表框(JList)不会从自定义 ListModel 动态更新

    我正在使用 Seesaw 在 Clojure 中开发 GUI 应用程序 并且在我的自定义 ListModel 更新时无法更新列表框 Java 中的 JList 这是我的一些代码 deftype ActionHistoryListModel
  • python 中多线程应用程序中的分段错误

    我在 python 中有一个多线程应用程序 其中我创建了多个生产者线程 它们从数据库中提取数据 数据以块的形式提取 因此 线程创建具有限制值的sql语句的部分被保留在锁内 为了让线程同时执行查询 query 函数被保留在锁之外 然后结果获取