在Python中跨进程共享到postgres db的连接

在Python中跨进程共享到postgres db的连接,python,postgresql,psycopg2,python-multiprocessing,Python,Postgresql,Psycopg2,Python Multiprocessing,我有一个Python脚本作为守护进程运行。在启动时,它产生5个进程,每个进程都连接到Postgres数据库。现在,为了减少DB连接的数量(最终会变得非常大),我试图找到一种跨多个进程共享单个连接的方法。为此,我正在研究multiprocessing.sharedTypes.ValueAPI。但是,我不确定如何使用此API跨进程传递psycopg2.connection对象。有人能告诉我怎么做吗 为了解决这个问题,我也愿意接受其他想法 我没有考虑将连接作为构造函数的一部分传递给5个进程的原因是互斥

我有一个Python脚本作为守护进程运行。在启动时,它产生5个进程,每个进程都连接到Postgres数据库。现在,为了减少DB连接的数量(最终会变得非常大),我试图找到一种跨多个进程共享单个连接的方法。为此,我正在研究
multiprocessing.sharedTypes.Value
API。但是,我不确定如何使用此API跨进程传递
psycopg2.connection
对象。有人能告诉我怎么做吗

为了解决这个问题,我也愿意接受其他想法


我没有考虑将连接作为构造函数的一部分传递给5个进程的原因是互斥处理。如果我采用这种方法,我不确定如何防止多个进程访问连接。有人能告诉我这样做是否正确吗?

这样的进程之间不能正常共享DB连接。您可以在线程之间共享某种连接,但前提是您必须确保该连接一次仅由一个线程使用。这在进程之间不起作用,因为客户端地址空间中存储了连接的客户端状态

如果您需要大量并发工作进程,但它们并非始终使用DB,则应该有一组数据库工作进程来处理所有数据库访问并与其他工作进程交换数据。每个数据库工作进程都有一个数据库连接。其他进程仅通过数据库工作者与数据库通信


Python的多处理队列、FIFO等提供了相应的消息传递功能。

不清楚您在这里寻找什么。5个连接当然不是问题。您是说您最终可能需要生成100或1000个进程,每个进程都有自己的连接?如果是这样,即使您可以共享它们,它们也会绑定到连接池,因为在任何给定的时间只有一个进程可以使用给定的连接。您的第二句话似乎与psycopg2文档相冲突:许多线程可以使用单独的会话并为每个线程创建连接,或者使用相同的连接并创建单独的游标来访问同一数据库。你能澄清一下吗?psycopg2有一个互锁,通过阻止多个线程同时使用它,允许多个线程共享一个连接。对于经常访问数据库的并发工作人员来说,这是非常无用的,因为在任何给定的时间,除了一个线程外,其他线程都会等待。但是,如果您有很多工作人员,每个人都需要偶尔访问数据库,那么它非常方便。您完全正确,后者是专用数据库工作池的替代品。这是有道理的。我想,您也基本上回答了这个问题。如果您的所有员工都以DB操作结束他们的工作,您还会使用“数据库工作进程”吗?我看到的另一个解决方案是在流程初始化中创建一个新连接,您认为它更合适吗?