gpt4 book ai didi

django - Django 持久数据库连接线程安全如何?

转载 作者:行者123 更新时间:2023-12-03 12:48:59 27 4
gpt4 key购买 nike

在django 中,持久数据库连接是通过threading.local 实现的。此代码位于类 django.db.utils.ConnectionHandler 中。因为这个类是在 django.db.__init.__.py 中实例化的,所以它在我们执行 import django.db 时被实例化。这会在请求/响应周期的某个地方发生。对于同一线程中的后续请求,甚至同一进程中的不同线程 django.db.__init__.py 都不会执行,因为它已经加载。

所以我的问题是它不会为同一进程中的所有线程共享连接。我在这里遗漏了什么吗?

我认为像下面这样的东西应该可以正常工作

# file db/__init__.py
connections = threading.local()
connections.connections = ConnectionHandler()

最佳答案

ConnectionHandler 不是连接——它只处理连接。它通过将它们存储在 self._connections(一个 thread.local 实例)上以一种完全线程安全的方式实现。

ConnectionHandler 覆盖 __getitem__ 以支持线程本地连接。当您访问 connections['default'] 时,它会查看 default 属性是否存在于 self._connections 上,这是一个本地线程。如果是,那将是当前线程到默认数据库的连接。如果没有,它将创建一个新的并将其设置为 self._connections。其他线程将无法访问此连接,因为它是在线程本地对象上设置的。

最后,它几乎归结为公共(public) API。在线程本地对象上设置 ConnectionHandler 也可以,但是公共(public) API 会比现在更复杂,因为用户代码需要手动检查当前线程的处理程序是否存在.

关于django - Django 持久数据库连接线程安全如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34695052/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com