我有一个作为守护进程运行的Python脚本。在启动时,它会生成5个进程,每个进程都连接到Postgres数据库。现在,为了减少数据库连接的数量(最终会变得非常大),我试图找到一种跨多个进程共享单个连接的方法。为此,我正在查看multiprocessing.sharedctypes.Value
API。但是,我不确定如何跨进程使用此API传递psycopg2.connection
对象。谁能告诉我怎么做?
我也愿意接受其他想法以解决这个问题。
我没有考虑将连接作为构造函数的一部分传递给5个进程的原因是互斥处理。如果我遵循这种方法,我不确定如何防止多个进程访问连接。有人可以告诉我这是否是正确的做法?
答案 0 :(得分:6)
您不能在这样的流程之间共享数据库连接。您可以排序共享线程之间的连接,但前提是您确保连接一次仅由一个线程使用。这不会在进程之间工作,因为存储在客户端地址空间中的连接的客户端状态。
如果您需要大量并发工作者,但他们一直没有使用数据库,那么您应该拥有一组数据库工作者进程来处理所有数据库访问和交换数据与您的其他工作进程。每个数据库工作进程都有一个DB连接。其他进程只通过数据库工作人员与数据库通信。
Python的多处理队列,fifos等为此提供了适当的消息传递功能。