Thread Local Objects在Flask中的含义是什么?

Sid*_*rth 18 python flask

我正在阅读Flask文档,我读到了这个 -

Flask的设计决策之一就是简单的任务应该很简单; 他们不应该采取大量的代码,但他们不应该限制你.因此,Flask几乎没有设计选择,有些人可能会发现令人惊讶或非正统.例如,Flask在内部使用线程局部对象,因此您不必在请求中将函数从函数传递到函数以保持线程安全.这种方法很方便,但需要有效的请求上下文来进行依赖注入,或者在尝试重用使用与请求挂钩的值的代码时.Flask项目是诚实的线程本地,不隐藏它们,并在代码和文档中调用它们使用它们.

这是什么意思?具体是以下问题 -

  • 什么是线程本地对象?它们如何以及何时被使用以及它们解决了什么目的?
  • 如何在内部使用线程局部对象来确保线程安全以及如何将对象传递给函数导致非线程安全?
  • 在这种情况下,有效请求上下文的含义是什么?

Mar*_*ers 22

线程局部对象是存储在专用结构中的对象,与当前线程id相关联.如果您询问此结构的对象,它将使用当前线程标识符为您提供当前线程的唯一数据.见threading.local.您可以通过输入import _threading_local; help(_threading_local)Python交互式解释器来获得更多详细信息.

这意味着无论何时使用current_app,g或者requests您获得了一个在您的线程中可以安全使用的数据结构,您无需担心锁定和其他并发问题.

在正常操作中,Flask处理传入的WSGI请求; 为每个此类请求创建一个请求上下文; 这由grequest对象表示.如果您尝试使用任何视图而没有传入请求(例如,在测试中),那么该request对象将无法工作并抱怨没有有效的请求上下文.Flask为您提供了在这种情况下按需生成此类上下文的工具.请参阅伪造资源和上下文文档以及请求上下文章节.

  • @variable:如何处理并发取决于 WSGI 容器服务器,而不是 Flask 本身,例如,如果您使用 Gunicorn,您可以[配置进程和线程的数量](http://docs.gunicorn.org/en/latest/ settings.html#worker-processes) 它将使用。每个请求都有一个*新*“current_app”和“request”对象。其他代码,例如 [Flask `Session` API](https://flask.palletsprojects.com/en/1.1.x/api/#sessions) 构建在其之上,以执行诸如基于令牌加载数据之类的操作。那是完全分开的。 (3认同)