【问题标题】:Flask contexts (application and request) vs thread-local variablesFlask 上下文(应用程序和请求)与线程局部变量
【发布时间】:2016-08-04 16:46:14
【问题描述】:

Flask Web Development 说:

from flask import request
@app.route('/')
def index():
  user_agent = request.headers.get('User-Agent')
  return '<p>Your browser is %s</p>' % user_agent

注意在这个视图中函数request是如何使用的,就好像它是一个全局的一样 多变的。实际上,request 不能是全局变量,如果你 考虑在多线程服务器中线程正在处理 同时来自不同客户端的不同请求,所以每个 线程需要在请求中看到不同的对象。上下文启用 Flask 使线程可以全局访问某些变量 不干扰其他线程。

可以理解,但为什么不简单地将request 变成thread-local variable?在底层,request 到底是什么,它与线程局部变量有何不同?

【问题讨论】:

  • 因为线程局部变量无法区分greenlet?

标签: python python-3.x flask python-multithreading


【解决方案1】:

这只是 Armin(Flask 的作者)的设计决定。你确实可以重写 Flask 以作为线程本地运行,但这不是他想要在这里做的。

Flask 的想法(一般而言)是让事情尽可能简单,并抽象出很多思考。这就是为什么很多 Flask 助手都被实现为“全局变量”的原因:你不必考虑它背后的含义,因为每个全局都绑定到传入的请求。

【讨论】:

  • 我刚刚意识到如果session 是线程本地的,我不明白它是如何工作的,所以我将其作为separate question 询问
猜你喜欢
  • 2014-05-19
  • 2014-07-16
  • 2015-10-17
  • 2017-06-08
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
相关资源
最近更新 更多