【问题标题】:Forking Django DB connections分叉 Django 数据库连接
【发布时间】:2013-08-31 19:06:30
【问题描述】:

我有一个应用程序通过 TCP 连接接收数据并将其写入 postgres 数据库。然后我使用 django web 前端为这些数据提供一个 gui。由于 django 提供了有用的数据库访问方法,我的 TCP 接收器也使用 django 模型来写入数据库。

我的问题是我需要使用分叉的 TCP 服务器。分叉会导致子进程和父进程共享句柄。我读过 Django 不支持分叉,并且确实共享数据库连接会导致问题,例如这些例外:

DatabaseError: SSL 错误:解密失败或坏记录 mac

InterfaceError: 连接已关闭

让分叉的 TCP 服务器工作的最佳解决方案是什么?

  • 我能否确保分叉的进程使用自己的数据库连接?
  • 我应该查看其他模块以写入 postgres 数据库吗?

【问题讨论】:

  • 分叉到底解决了什么问题?
  • 对我来说主要原因是速度和弹性。该服务器正在处理大量数据,并且线程切换是一分钟的限制。多进程意味着没有 GIL 问题(我知道套接字操作在阻塞时会释放 GIL,但后处理一次只能在一个线程中发生)。
  • 除非你的 CPU 严重受限,否则我会通过 eventlet 或 gevent 使用绿色线程。 eventlet 和 gevent 都具有使 Postgres 能够很好地处理许多并发连接的机制。这是一个选择吗?

标签: python django postgresql


【解决方案1】:

所以我找到的一个解决方案是创建一个新线程来生成。 Django 为每个线程打开一个新连接,因此从一个新线程生成可确保您将新连接传递给新进程。

回想起来,我希望我从一开始就直接使用 psycopg2 而不是 Django。 Django 非常适合 Web 前端,但对于我使用它的只是模型层的独立应用程序来说不是很好。使用 psycopg2 可以更好地控制何时关闭和打开连接。不仅仅是因为分叉问题,而且我发现 Django 并没有保持持久的 postgres 连接——我们应该在 1.6 版本中更好地控制这一点,并且应该为我的特定应用程序带来巨大的性能提升。此外,在这种类型的应用程序中,我发现 Django 故意泄漏 - 可以通过将 DEBUG 设置为 False 来修复。再说一次,我现在已经编写了应用程序:)

【讨论】:

    【解决方案2】:

    libpq 驱动程序是 django 通常使用的psycopg2 驱动程序的基础,它不支持分叉活动连接。我不确定是否有另一个驱动程序没有,但我认为不会 - 该协议不支持在同一连接上多路复用多个会话。

    解决您的问题的正确方法是确保每个分叉的进程都使用自己的数据库连接。最简单的方法通常是等到分叉之后再打开连接。

    【讨论】:

    • 是的,但问题是如何确保每个分叉的进程使用自己的数据库连接。我有一个特定情况,其中数据库连接必须在分叉之前打开。我认为答案将是直接使用 psycopg2 以便我可以显式控制它而不是让 Django 管理连接。
    猜你喜欢
    • 2018-07-13
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2019-11-08
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多