我正在使用multiprocessing.Pool运行许多进程
每个进程都必须查询我的mysql数据库。
目前,我只连接数据库一次,然后共享进程之间的连接。
它可以工作,但偶尔我会遇到一些奇怪的错误。我已经确认,这些错误是在查询数据库时引起的。
我认为问题是因为对所有进程都使用了相同的连接。
当我寻找答案的时候,我偶然发现了这个问题&一个How to share a single MySQL database connection between multiple processes in Python
所以我查了一下pooling.MySQLConnectionPool类
如果我能理解的话。我将设置一个具有多个连接的池,并在进程之间共享该池。然后,每个进程将查看该池,如果连接可用,请使用它,否则等待连接被释放。
但后来我发现了这个q&a Accessing a MySQL connection pool from Python multiprocessing
首先,"mata“证实了我的怀疑,但同时他拒绝使用设置一个池来在进程之间共享。
在不同进程之间共享数据库连接(或连接池)是个坏主意(我非常怀疑它是否能够正常工作),
相反,他建议
因此,使用它自己的连接的每个进程实际上都是您应该追求的目标。
那是什么意思?
mata在他的回答中给出的例子似乎是合理的,但我不理解整个池的传递作为init的论点。
p = Pool(initializer=init)将阻塞的Pool.map()方法更改为Pool.map_async()并将连接从池发送到map_async(q,ConnObj)就足够了吗?
在评论中提到
使用多个进程的单个池的唯一方法是有一个专用进程,该进程使用队列与所有db访问进行通信。
更新发现了这个。似乎同意:https://stackoverflow.com/a/26072257/1267259
如果您需要大量并发工作人员,但他们并不总是在使用DB,那么您应该有一组数据库工作进程来处理所有数据库访问,并与其他工作进程交换数据。每个数据库工作进程都有一个DB连接。其他进程只通过数据库工作人员与数据库对话。 Python的多处理队列、fifos等提供了相应的消息传递功能。
mysql池的目的不是处理进程的请求并将它们中继到可用的连接吗?
现在我只是困惑..。
发布于 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
https://stackoverflow.com/questions/28638939
复制相似问题