在Python中跨进程共享与postgres数据库的连接

Dip*_*jee 2 python postgresql psycopg2 python-multiprocessing

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

我也愿意接受其他想法以解决这个问题.

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

Cra*_*ger 6

您不能在这样的流程之间共享数据库连接.您可以排序的份额之间的连接线,但只有当你确保连接一次只使用一个线程.这在进程之间不起作用,因为存在客户端地址空间的连接存在客户端状态.

如果您需要大量并发工作者,但他们并不是一直使用数据库,那么您应该拥有一组数据库工作进程来处理所有数据库访问并与您的其他工作进程交换数据.每个数据库工作进程都有一个DB连接.其他进程只通过数据库工作人员与数据库通信.

Python的多处理队列,fifos等为此提供了适当的消息传递功能.

  • psycopg2 有一个互锁,允许多个线程通过防止它们同时使用它来共享连接。对于大量访问数据库的并发工作人员来说,这是非常无用的,因为在任何给定时间,除了一个线程外,所有线程都在等待。但是如果你有很多工人,每个工人都需要偶尔访问数据库,这很方便。您说得对,后者是专用数据库工作池的替代品。 (3认同)