Python 分叉Django DB连接

Python 分叉Django DB连接,python,django,postgresql,Python,Django,Postgresql,我有一个通过TCP连接接收数据并将其写入postgres数据库的应用程序。然后,我使用django web前端为这些数据提供gui。因为django提供了有用的数据库访问方法,所以我的TCP接收器也使用django模型来写入数据库 我的问题是我需要使用一个分叉的TCP服务器。分叉会导致子进程和父进程共享句柄。我已经读到Django不支持分叉,事实上,共享数据库连接正在导致问题,例如,这些异常: DatabaseError:SSL错误:解密失败或记录错误mac 接口错误:连接已关闭 使分叉TCP服

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

我的问题是我需要使用一个分叉的TCP服务器。分叉会导致子进程和父进程共享句柄。我已经读到Django不支持分叉,事实上,共享数据库连接正在导致问题,例如,这些异常:

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

接口错误:连接已关闭

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

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

    • django通常使用的
      psycopg2
      驱动程序所基于的
      libpq
      驱动程序不支持分叉活动连接。我不确定是否有其他驱动程序不支持,但我假设没有-协议不支持在同一连接上多路复用多个会话


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

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


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

      你用叉子到底解决了什么问题?我的主要原因是速度和弹性。此服务器正在处理大量数据,线程切换是目前的限制。多进程意味着没有GIL问题(我知道套接字操作在阻塞时会释放GIL,但后处理一次只能在一个线程中发生)。我会通过eventlet或gevent使用绿色线程,除非CPU严重受限。eventlet和gevent都有一些机制,可以让Postgres在许多并发连接中运行良好。这是一个选项吗?是的,但问题是如何确保每个分叉进程使用自己的数据库连接。我有一个特定的例子,数据库连接必须在fork之前打开。我认为答案是直接使用psycopg2,这样我就可以显式地控制它,而不是让Django管理连接。