首先,从“是”开始,我检查并搜索了这个主题,但找不到任何能让我对我的问题给出明确答案的东西?我是Djagno的初学者,正在研究它的文档,其中我阅读了关于模板标记的节点呈现方法的线程安全注意事项。这里是文档Link的链接。我的问题在于,它指出一旦解析了节点,该节点的render方法可能会被多次调用我很困惑,它是在讨论同一文档中同一用户在不同的位置使用同一用户在服务器上的单实例级别的模板标记还是在内存中共享同一个django实例的来自世界各地的用户的多个请求使用模板标记?如果是后者,django不为每个新用户请求在服务器级别创建一个新实例,并为内存中的每个用户提供单独的资源,或者我错了吗?在
是后者。在
WSGI服务器通常运行多个持久化进程,并且在每个进程中运行多个线程。虽然可以应用一些自动伸缩,但进程和线程的数量或多或少是恒定的,并决定了Django可以处理多少并发请求。每个请求都会创建一个新的CGI进程的日子已经一去不复返了,在大多数情况下,持久化进程的效率要高得多。在
每个进程都有自己的内存,进程之间的通信通常由数据库、缓存等来处理,它们不能直接通过内存进行通信。在
进程中的每个线程共享相同的内存。这意味着任何不在本地范围内的对象(例如只在函数内部定义的对象)都可以从其他线程访问。缓存的模板加载器对每个进程解析一次每个模板,每个线程使用相同的解析节点。这也意味着,如果在一个线程中设置
self.foo = 'bar'
,那么在访问self.foo
时,每个线程都将读取'bar'
。由于多个线程同时运行,这很快就会变成一个无法调试的巨大混乱,这就是为什么线程安全如此重要。在正如文档所说,只要您不在
self
上存储数据,而是将其放入context.render_context
中,就可以了。在相关问题 更多 >
编程相关推荐