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

时间:2019-01-10 17:01:24

标签: python memory flask uwsgi

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

我正在尝试做的事情: 我有一个烧瓶应用程序,它将在nginx + uwsgi上运行。我希望每个http请求都可以访问位于etcd数据库中的某些数据。但是,这很慢。为了加快http响应速度,我正在考虑在flask应用启动时将数据从DB加载到flask应用的内存中。因此,根据每个请求,可以从本地内存快速访问此数据,而无需询问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

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

1 个答案:

答案 0 :(得分:0)

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

  1. 预分叉:这是默认模式。在这种模式下,一个主进程加载了应用程序,然后从该主进程派生了工作进程。这导致工作人员具有与主进程相同的内存,直到他们修改内存为止。在这种情况下,遵循写时复制语义。因此在这种情况下,参考我的代码,所有工作人员将共享我在应用程序启动时加载的状态,直到他们对其进行修改为止。
  2. Lazy-apps:在这种模式下,每个工作进程都加载其自己的应用程序,因此在我的代码上下文中,每个工作进程都将调用populate_info。但这当然不是很有效的存储。

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