哪些Django是线程安全的,哪些不是?

时间:2013-12-10 09:37:51

标签: python django multithreading thread-safety webserver

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

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

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

我有两个猜测:
- Django明确地将中间件对象保存在共享内存中,而不是为其他对象执行此操作,因此其他对象是线程安全的。
- 在第二个例子中,在文章中,线程安全关键数据的生命周期远远少于第一个示例,因此,线程不安全操作可能没有时间发生。

还有issues with thread-safety in Django templates

我的问题是 - 如何猜测Django线程安全的时间和不在哪里?它或公约中有任何逻辑吗?另一个问题 - 我知道请求对象是线程安全的 - 很明显,它不安全,使用Django构建的网站无法运行,但究竟是什么让它具有线程安全性呢?

1 个答案:

答案 0 :(得分:8)

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

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

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