在Flask应用程序中保持全局状态

时间:2018-08-16 09:54:22

标签: python flask

这似乎是一个非常明显的问题,但是与此相关的许多文档非常混乱,并警告我不要保持全局状态而不是告诉我怎么做。

例如,如果我需要一个数据库连接池(我不使用SQLAlchemy)或一个对象实例池(这两个对象都需要集中管理的 global 池) ,我该怎么做?

如果我使用flask.g,则不会在线程之间共享,如果使用python全局,则不会在同一应用程序的多个进程之间共享(据我所知,在大型生产烧瓶服务器)。我是否使用flask.current_app?我是否使池本身成为一个单独的过程?还有吗?

1 个答案:

答案 0 :(得分:1)

有关在Web后端应用程序中“不保持每个进程的全局状态”的警告(您将在Django或任何wsgi应用程序中遇到同样的问题)仅适用于希望在请求之间共享的状态,并且流程。

如果可以具有每个进程的状态(例如,数据库连接通常是每个进程的状态),那么这不是问题。 wrt /连接池,您可以(也可以不)确定每个服务器进程具有不同的池是可以的。

对于其他任何情况-需要在进程之间共享的任何状态-通常由某些人使用一些外部数据库或缓存进程来处理,因此,如果您要为所有Flask进程使用一个连接池,则将拥有确实使用不同的服务器进程来维护池。

还请注意:

  

同一应用程序的多个进程(据我了解,在大型生产烧瓶服务器的情况下可以生成

实际上,这与“大”无关。使用传统的“阻塞”服务器,您只能使用多线程或多处理来处理并发请求。 Unix哲学传统上出于各种原因而倾向于多处理(“ prefork”模型),并且无论如何(至少在这种情况下)都Python's multithreading is bordering on useless如此,因此如果您希望一次处理一个以上的单个请求,则没有太多选择。时间。

长话短说,请考虑一下,任何wsgi应用程序的生产设置都将在后台运行多个过程。