gpt4 book ai didi

python - 是否可以在运行 flask 应用程序的 uwsgi 进程之间共享内存?

转载 作者:行者123 更新时间:2023-12-03 15:46:07 42 4
gpt4 key购买 nike

我想知道在具有多个进程+线程的 uwsgi 上运行的 flask 应用程序是否可以访问在 Flask 应用程序类中定义的公共(public)内存数据结构。

我正在尝试做的事情:
我有一个 flask 应用程序,它将在 nginx + uwsgi 上运行。我希望每个 http 请求都能访问位于 etcd 数据库中的一些数据。但是,这很慢。为了加快 http 响应,我正在考虑在 flask 应用程序启动时将数据从数据库加载到 flask 应用程序的内存中。因此,在每次请求时,都可以从本地内存中快速访问这些数据,而不是询问 etcd。

我如何尝试这样做:
我已经定义了我自己的 Flaskapp 类并从“Flask”继承它并覆盖了“ init ”来加载 pre-appstart 状态:

class FlaskApp(Flask):

def __init__(self, *args, **kwargs):
self.populate_info() # This function will load stuff
super(FlaskApp, self).__init__(*args, **kwargs)
def populate_info(self):
self.stuff = []
#load stuff from db to self.stuff

每个 flask 请求都能读取 self.stuff 吗?根据我的理解,来自 C++ 背景,这取决于 uwsgi 如何运行 flask 应用程序。所以我需要答案:1)每个 uwsgi 进程都会实例化 Flask App 吗? 2)还是uwsgi在内存中实例化Flask App实例一次,在每个进程之间共享,然后每个进程在每个请求上只调用该实例的http请求处理程序?我尝试搜索文档以了解 uwsgi 如何安排这一点,但找不到足够的信息来理解这一点。所以会很感激任何帮助。如果这种内存共享不起作用(这是我的预感),有什么替代方法可以做到这一点?谢谢。

最佳答案

在深入研究 uwsgi 文档后,我发现 uwsgi 有 2 种功能模式:

  • 预 fork :这是默认模式。在这种模式下,一个主进程加载应用程序,然后从这个主进程派生工作进程。这导致工作人员在修改内存之前拥有与主进程相同的内存。在这种情况下,遵循写时复制语义。因此,在这种情况下,引用我的代码,我在应用程序启动时加载的状态将由所有工作人员共享,直到他们修改它。
  • Lazy-apps:在这种模式下,每个工作进程加载自己的应用程序,因此在我的代码上下文中,populate_info 将被每个工作人员调用。但这当然不是很有效的内存。

  • 我发现这个链接很有帮助: https://engineering.ticketea.com/uwsgi-preforking-lazy-apps/

    关于python - 是否可以在运行 flask 应用程序的 uwsgi 进程之间共享内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54133550/

    42 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com