python - Django 中的中间件是线程安全的吗?

标签 python django multithreading thread-safety webserver

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

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

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

我有两个猜测:

  • Django 显式地将中间件对象保存在共享内存中,并且不会对其他对象这样做,因此其他对象是线程安全的。
  • 在第二个示例中,在文章中,线程安全关键数据的生命周期比第一个示例短得多,因此线程不安全操作可能根本没有时间发生。

还有issues with thread-safety in Django templates .

我的问题是 - 如何猜测 Django 线程安全的时间和不安全的位置?它有什么逻辑或约定吗?另一个问题 - 我知道请求对象是线程安全的 - 很明显,它不安全,用 Django 构建的网站将无法运行,但究竟是什么让它成为线程安全的?

最佳答案

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

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

一般来说,您唯一需要担心线程安全的对象是那些您在模块或类级别而不是在函数/方法内实例化的对象,以及那些您没有自己实例化的对象,例如这里的中间件。即使在那里,请求也是一个明确的异常(exception):您可以指望那些是按请求(自然)。

关于python - Django 中的中间件是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20490769/

相关文章:

java - Java 中的进程——它们同时工作吗?

java - 尽管创建了应该处于 sleep 状态的新线程,但在线程 sleep 时无法选择切换按钮

c++ - 在 C++ 中使用 std::Vector 进行多线程

python - setup.py:先运行 build_ext

python - 在 linux apache 2.4 上运行 python3 脚本

Python 对象属性共享

django - 从 Tarball 失败 Django 错误安装 Hue?

python - 如何装饰 Django 中的管理操作,action.__name__ 用作字典键?

python - 如何计算多维数组中的 N 个最大元素?

django - 如何仅删除 m2m 关系?