首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3.x如何在进程之间共享数据库连接?

Python3.x如何在进程之间共享数据库连接?
EN

Stack Overflow用户
提问于 2015-02-20 21:58:20
回答 1查看 8.1K关注 0票数 15

我正在使用multiprocessing.Pool运行许多进程

每个进程都必须查询我的mysql数据库。

目前,我只连接数据库一次,然后共享进程之间的连接。

它可以工作,但偶尔我会遇到一些奇怪的错误。我已经确认,这些错误是在查询数据库时引起的。

我认为问题是因为对所有进程都使用了相同的连接。

  • 是对的吗?

当我寻找答案的时候,我偶然发现了这个问题&一个How to share a single MySQL database connection between multiple processes in Python

所以我查了一下pooling.MySQLConnectionPool类

  • http://dev.mysql.com/doc/connector-python/en/connector-python-connection-pooling.html
  • http://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlconnectionpool.html
  • http://dev.mysql.com/doc/connector-python/en/connector-python-api-pooledmysqlconnection.html

如果我能理解的话。我将设置一个具有多个连接的池,并在进程之间共享该池。然后,每个进程将查看该池,如果连接可用,请使用它,否则等待连接被释放。

  • 是对的吗?

但后来我发现了这个q&a Accessing a MySQL connection pool from Python multiprocessing

首先,"mata“证实了我的怀疑,但同时他拒绝使用设置一个池来在进程之间共享。

在不同进程之间共享数据库连接(或连接池)是个坏主意(我非常怀疑它是否能够正常工作),

相反,他建议

因此,使用它自己的连接的每个进程实际上都是您应该追求的目标。

那是什么意思?

  • 应该为每个员工创建一个连接吗?那么mysql池有什么好处呢?

mata在他的回答中给出的例子似乎是合理的,但我不理解整个池的传递作为init的论点。

代码语言:javascript
复制
p = Pool(initializer=init)
  • 为什么?(正如ph_singer在评论中指出的,这不是一个好的解决方案)

将阻塞的Pool.map()方法更改为Pool.map_async()并将连接从池发送到map_async(q,ConnObj)就足够了吗?

  • 是对的吗?

在评论中提到

使用多个进程的单个池的唯一方法是有一个专用进程,该进程使用队列与所有db访问进行通信。

更新发现了这个。似乎同意:https://stackoverflow.com/a/26072257/1267259

如果您需要大量并发工作人员,但他们并不总是在使用DB,那么您应该有一组数据库工作进程来处理所有数据库访问,并与其他工作进程交换数据。每个数据库工作进程都有一个DB连接。其他进程只通过数据库工作人员与数据库对话。 Python的多处理队列、fifos等提供了相应的消息传递功能。

  • 这真的是对的吗?

mysql池的目的不是处理进程的请求并将它们中继到可用的连接吗?

现在我只是困惑..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-21 23:07:27

发现Share connection to postgres db across processes in Python

我第一个问题的答案似乎是

您不能在这样的进程之间明智地共享DB连接。您可以在线程之间对共享连接进行排序,但前提是必须确保每次只由一个线程使用该连接。这将无法在进程之间工作,因为存储在客户端地址空间中的连接存在客户端状态。

对我剩下的问题的回答基本上可以归结为以下哪一种陈述(从本问答中的评论中的讨论)

基本上,我们的想法是在主进程中创建一个连接池,然后在每个生成的线程/进程中请求来自该池的连接。线程不应该共享相同的连接,因为这样线程就可以阻止线程应该帮助执行的主要活动之一: IO。-F先生

不要将池或连接从池传递到子进程。

如果每个子进程需要数据库连接(单独或作为一个池),则创建自己的db连接-J.F.Sebastian。

“为什么使用db连接池”--如果工作进程中有多个线程,那么这个池可能很有用(几个线程可以并行读写数据(CPython可以在I/O期间释放GIL )。如果每个工作进程只有一个线程,那么就没有必要使用db池。- J.F. Sebastian

作为旁注

这并不完全回答我的第三个问题,但实际上在某些情况下,每个流程创建一个连接是可行的(Share connection to postgres db across processes in Python)

你在这里找什么还不清楚。5连接当然不是问题。您的意思是您最终可能需要生成10秒或1000秒的进程,每个进程都有自己的连接?如果是这样的话,即使您可以共享它们,它们也会绑定到连接池,因为在任何给定的时间,只有一个进程可以使用给定的连接。-9月27日-9月27日下午5:19

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28638939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档