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