Python 烧瓶中的线程局部对象是什么意思?

Python 烧瓶中的线程局部对象是什么意思?,python,flask,Python,Flask,我正在阅读烧瓶文档(具体来说,是- 烧瓶中的设计决策之一是简单的任务应该是简单的;它们不应该占用大量代码,但也不应该限制您。正因为如此,Flask的设计选择很少,有些人可能会感到惊讶或非正统。例如,Flask在内部使用线程本地对象,这样您就不必在请求中在函数之间传递对象以保持线程安全。这种方法很方便,但需要一个有效的请求上下文来进行依赖项注入,或者在尝试重用使用与请求挂钩的值的代码时。Flask项目对线程局部变量是诚实的,不隐藏它们,并在使用它们的代码和文档中调用它们 这是什么意思?特别是以下问

我正在阅读烧瓶文档(具体来说,是-

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

这是什么意思?特别是以下问题-

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

线程本地对象是一个存储在专用结构中的对象,与当前线程id绑定。如果您向该结构请求该对象,它将使用当前线程标识符为您提供当前线程唯一的数据。看见您还可以通过输入
import\u threading\u local获得更多详细信息;帮助(\u threading\u local)
进入Python交互式解释器

这意味着,无论何时使用
current_app
g
请求
,您都可以在线程(或进程或eventlet)中安全使用数据结构,而不必担心锁定和其他并发问题


在正常操作中,Flask处理传入的WSGI请求;为每个这样的请求创建一个请求上下文;这由
g
request
对象表示。如果您试图在没有传入请求的情况下使用任何视图(例如,在测试中),则
请求
对象将无法工作,并抱怨没有有效的请求上下文。在这种情况下,Flask为您提供了按需生成这种上下文的工具。请参阅,以及章节。

当用户在浏览器中输入flask URL,并且请求到达flask服务器时,flask服务器是否为每个URL请求启动新进程或新线程?每个进程/线程是否都有包含用户以前请求中的g、当前_应用程序和请求对象的请求上下文?这些请求存储在服务器上,并根据用户请求发送的令牌进行解密?@variable:如何处理并发性取决于WSGI容器服务器,而不是Flask本身,如果你用的是Gunicorn,你可以用它。每个请求都有一个新的
当前应用程序
请求
对象。其他代码,比如上面的构建,可以执行基于令牌加载数据等操作。这是完全不同的。我相信Flask也会调用
current_app
request
,因为它们在单个线程上的每个请求后都会被销毁(而不是线程局部变量,这意味着与线程具有相同的生存期)。@kennysong yes,但是该特性的文档明确引用了线程本地概念,这个问题是关于这个概念的。我的回答回答了这个问题,我不是在这里指名道姓。