在运行Flask应用程序的uWSGI进程之间共享内存是否可能?

11

我想知道运行在uwsgi上有多个进程+线程的Flask应用程序是否能访问在Flask应用程序类内定义的共同内存数据结构。

我的目标是: 我有一个Flask应用程序,将在nginx + uwsgi上运行。我希望每个HTTP请求都能访问存储在etcd数据库中的一些数据。但这很慢。为了加快HTTP响应速度,我考虑在Flask应用程序启动时将数据从DB加载到应用程序的内存中。因此,在每个请求中,可以从本地内存快速访问此数据,而不必询问etcd。

我如何实现这一点: 我定义了自己的Flaskapp类,并从“Flask”继承它,并重写了“init”以加载预先应用程序启动状态:

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如何进行调度,但找不到足够的信息来理解这一点。因此,将感激任何帮助。如果这种内存共享行不通(这是我的直觉),有什么替代方法可以做到这一点吗?谢谢。

1个回答

8
在深入研究uwsgi文档后,我发现uwsgi有两种工作模式:
  1. 预分叉:这是默认模式。在此模式下,一个主进程加载应用程序,然后从该主进程分叉出工作进程。这导致工作进程具有与主进程相同的内存,直到它们修改内存。在这种情况下,遵循写时复制语义。因此,在我的代码中,启动应用程序时加载的状态将由所有工作进程共享,直到它们修改为止。
  2. 懒加载应用程序:在此模式下,每个工作进程都加载自己的应用程序,因此在我的代码上下文中,populate_info函数将被每个工作进程调用。但这当然不是非常内存高效的。
我发现这个链接很有帮助:https://engineering.ticketea.com/uwsgi-preforking-lazy-apps/

你最终选择了哪个uwsgi配置? - Saturnian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接