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

时间:2014-09-17 10:15:45

标签: python flask

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

  

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

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

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

1 个答案:

答案 0 :(得分:20)

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

这意味着无论何时使用current_appgrequests,您都可以获得在线程中安全使用的数据结构,而无需担心锁定和其他并发问题的问题。

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