首页 > 解决方案 > Flask 中的全局变量和 sys.modules 概念是什么?

问题描述

我正在尝试理解烧瓶中的某些概念,如果您能提出建议,或者您能否将我指向相关的参考链接,我将不胜感激。

在 python 中,默认情况下,应用程序在 1 个进程和该进程中的单个线程上运行。如果我们使用线程,那么应用程序在 1 个进程和该进程中的 1 个线程上启动;然后,当它遇到线程代码时,它会在同一个进程中启动更多线程。当线程遇到“import module”语句时,python 会在 sys.modules 中加载该模块,并且这种情况仅在所有线程中发生一次,即使代码在当前线程或任何其他线程上遇到另一个具有相同模块名称的导入。

但是,我对 Flask 中的行为感到困惑。我读过一个进程可以有一个或多个烧瓶应用程序。并且一个烧瓶应用程序可以在多个进程中启动。

此外,flask 似乎本质上是多线程的,因为例如 - 假设我们只有一个 flask 应用程序,当我们运行 Flask 应用程序时,它会被加载到 1 个或多个进程(每个进程都有主线程)中,然后对于每个请求由用户创建,为请求分配一个新线程。这个新线程将处理请求(调用相应的函数)。

我想知道 -

1)考虑到烧瓶应用程序可以在多个进程中加载​​和/或每个进程可以有多个应用程序,模块是在每个线程(每个用户)还是烧瓶中的每个进程中加载​​到 sys.modules 中?

2)假设一个线程更新一个全局变量或模块变量或类变量,它与路由位于同一级别(即 - 在路由函数之外),(我知道这不是线程安全的,但假设它在这样没有冲突)。那么,每个后续线程(当前用户 reuqest 和其他用户请求)是否可以访问对全局变量所做的更新,或者后续线程只能看到全局变量、模块 var 和类 var 的原始值?我试图了解是否所有用户请求的线程都可以访问对全局变量所做的更新,因为我假设线程只运行相应的函数而没有别的。flask中的全局变量概念是什么?一个用户或所有用户的线程是全局的吗?

我知道线程局部变量(g,current_user)并且它们是基于每个请求的。我还读过在本地函数中声明的普通变量是线程安全的,但是如果说我声明变量并将其指向导入的模块的变量,然后对其进行变异,那么它将更新模块变量,并且任何引用模块变量的地方都会看到变化。那么它是如何线程安全的呢?

标签: pythonflask

解决方案


推荐阅读