shr*_*yas 2 django multithreading django-orm thread-local
在 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()
Run Code Online (Sandbox Code Playgroud)
这ConnectionHandler不是连接——它只处理连接。它通过将它们存储在self._connections,这是一个thread.local实例,以完全线程安全的方式来实现。
支持线程本地连接的ConnectionHandler覆盖__getitem__。当您访问 时connections['default'],它会查看该default属性是否存在于 上self._connections,这是一个本地线程。如果是,那将是当前线程到默认数据库的连接。如果没有,它将创建一个新的并将其设置为self._connections。其他线程将无法访问此连接,因为它是在线程本地对象上设置的。
最后,它几乎归结为公共 API。ConnectionHandler在线程本地对象上设置 a也可以工作,但公共 API 将比当前更复杂,因为用户代码需要手动检查当前线程的处理程序是否存在。