当前位置: 首页 > 面试题库 >

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

公良育
2023-03-14
问题内容

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

为了解决这个问题,我也开放其他想法。

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


问题答案:

您无法在这样的过程之间理智地共享数据库连接。您可以 排序 共享 线程
之间的连接,但是前提是您必须确保一次仅一个线程使用该连接。在进程之间这是行不通的,因为在客户端的地址空间中存储了连接的客户端状态。

如果您需要大量并发工作程序,但他们并没有一直在使用数据库,则应该有一组 数据库工作
程序进程来处理所有数据库访问并与其他工作程序进程交换数据。每个数据库工作进程都有一个数据库连接。其他进程仅通过数据库工作程序与数据库对话。

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



 类似资料:
  • 问题内容: 我正在尝试使用部分函数,​​以便pool.map()可以定位具有多个参数(在本例中为Lock()对象)的函数。 这是示例代码(摘自我之前的问题的答案): 但是,当我运行此代码时,出现错误: 我在这里想念什么?如何在子流程之间共享锁? 问题答案: 您不能将普通对象传递给方法,因为它们不能被腌制。有两种方法可以解决此问题。一种是创建并传递一个: 不过,这有点重量级;使用需要产生另一个进程来

  • 由于进程数据隔离,A进程的数据无法直接的被B使用,为解决该问题,可以尝试使用Swoole自带的Memory模块。 或者也可以尝试使用EasySwoole提供的ShareMemory,或者借助第三方的类似Redis之类的服务。

  • 问题内容: 我知道如何将其用于创建共享对象,尤其是可以在工作人员之间共享的队列。有这个问题,这个问题,[这个问题](http://codingdict.com/questions/1299甚至是我自己的一个问题。 但是,我需要定义很多队列,每个队列都链接一对特定的进程。假设每对进程及其链接队列均由变量标识。 当我需要放置和获取数据时,我想使用字典来访问我的队列。我无法完成这项工作。我已经尝试了很多

  • 我试图使CORS与Spring Security很好地配合,但它并不符合要求。我进行了本文所述的更改,更改中的这一行使我的应用程序可以使用POST和GET请求(临时公开控制器方法,以便测试CORS): 前面: 后面: 不幸的是,允许通过AJAX进行Spring Security登录的以下URL没有响应:。我正在将AJAX请求从发送到。 当尝试访问时,我在Chrome中获得了选项预飞行请求,AJAX

  • 我创建了一个可运行的类a,它为我执行一些任务。我使用ExecutorService提交这个类,以便并行执行这些任务。 可运行类A调用另一个对象B,该对象发送一个AsyncFuture请求(future.get()one)。 我将可运行类A的单独对象提交给ExecutorService,但是,类B的对象由bean(单例)引用。这会导致线程执行出现问题吗? 我注意到类A的一些对象没有被任何线程执行。

  • 问题内容: 我有简单的 UDPServer ,它可以与 多处理一起使用 。 我想创建一个列表,其中包含有关所有客户端的信息。 我使用 Manager ,但是我不明白如何在列表中附加信息-我需要传输Manager的对象来处理,但是如何呢?我的新属性方式不起作用。 如何解决?谢谢! 输出: 问题答案: 问题是您要在启动工作进程后立即让主进程完成其执行。当创建过程完成执行后,服务器将关闭,这意味着您的共