Django中的中间件是线程安全的吗



最近我读了这篇文章:http://blog.roseman.org.uk/2010/02/01/middleware-post-processing-django-gotcha/

我不明白,为什么那里描述的解决方案有效?

为什么实例化单独的对象使数据块线程安全?

我有两个猜测:

  • Django显式地将中间件对象保存在共享内存中,而不对其他对象执行此操作,因此其他对象是线程安全的
  • 在本文的第二个示例中,线程安全关键数据的生存期比第一个示例中要短得多,所以线程不安全操作可能并没有时间发生

Django模板中也存在线程安全问题。

我的问题是——如何猜测Django何时线程安全,在哪里不安全?它或惯例中有什么逻辑吗?另一个问题——我知道请求对象是线程安全的——很明显,它是不安全的,用Django构建的网站将无法运行,但到底是什么使它线程安全?

正如我在那篇文章中所指出的,重点是中间件在每个进程中实例化一次。在大多数部署Django的方法中,一个进程会持续多个请求。请注意,您永远不会自己实例化中间件对象:Django会处理这个问题。这表明它是在请求/响应周期之外完成的。

我在那里使用的额外对象正在process_response方法中实例化。因此,一旦该方法返回,新对象就会超出范围并被销毁,并且不存在线程安全问题。

一般来说,您必须担心线程安全的对象只有那些在模块或类级别而不是在函数/方法内部实例化的对象,以及那些您自己不实例化的对象(如这里的中间件)。即使在那里,请求也是一个明确的例外:您可以(自然地)指望每个请求都有请求。

最新更新