Flask框架中的线程局部是什么意思?

9 投票
1 回答
1603 浏览
提问于 2025-04-17 13:08

我正在评估用Python构建REST API的框架。我看过很多框架,包括Flask,发现Flask非常有趣,而且使用起来简单,具备构建REST网络服务所需的所有功能。

不过,有一点我不太明白,Flask的文档中提到它使用“线程本地对象,并且在可扩展性方面存在问题”。

Flask使用线程本地对象(实际上是上下文本地对象,它们也支持绿色线程上下文)来处理请求、会话以及一个可以放置自己内容的额外对象(g)。为什么要这样做,这不是个坏主意吗?是的,通常使用线程本地对象并不是个好主意。它们会给那些不基于线程概念的服务器带来麻烦,并让大型应用程序更难维护。不过,Flask本身并不是为了大型应用或异步服务器设计的。Flask的目标是让编写传统的网络应用变得快速而简单。

有人能帮我理解一下这里提到的可扩展性问题是什么吗?其他框架是怎么处理这个问题的呢?

1 个回答

4

这其实不是一个可扩展性的问题,更多的是会让维护复杂代码变得困难。原因在于线程本地变量被当作全局数据存储使用,这样就避免了通过函数参数传递状态,这样会让人更难理解代码的运行情况。

从速度上来说,线程本地变量并不是特别慢,但它们会让使用异步框架变得困难甚至不可能。在异步框架中,很多任务会在一个线程上短时间内运行。

撰写回答