是否可以在 uwsgi 进程 运行 flask app 之间共享内存?
is it possible to share memory between uwsgi processes running flask app?
我想知道在具有多进程+线程的 uwsgi 上运行的 Flask 应用程序 运行 是否可以访问 Flask 应用程序中定义的公共内存数据结构 class。
我想做什么:
我有一个烧瓶应用程序,它将 运行 在 nginx + uwsgi 上。我希望每个 http 请求都能访问 etcd 数据库中的一些数据。但是,这很慢。为了加快 http 响应,我正在考虑在 flask 应用程序启动时将数据从 DB 加载到 flask 应用程序的内存中。因此,在每次请求时,都可以从本地内存中快速访问此数据,而不是询问 etcd。
我是如何尝试做到这一点的:
我已经定义了我自己的 Flaskapp class 并从 "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 运行s 烧瓶应用程序的方式。所以我需要回答:1)是否每个 uwsgi 进程都实例化了 Flask App? 2) 或者 uwsgi 在内存中实例化 Flask App 实例一次,在每个进程之间共享它,然后每个进程在每个请求上只调用该实例的 http 请求处理程序?我尝试搜索文档以了解 uwsgi 如何安排它,但找不到足够的信息来理解它。因此,将不胜感激任何帮助。如果这种内存共享不起作用(这是我的直觉),那么有什么替代方法可以做到这一点?谢谢
深入研究 uwsgi 文档后,我发现 uwsgi 有两种功能模式:
- 预分叉:这是默认模式。在这种模式下,一个主进程加载应用程序,然后从该主进程派生出工作进程。这导致工作人员拥有与主进程相同的内存,直到他们修改内存为止。在这种情况下遵循写时复制语义。所以在这种情况下,参考我的代码,我在应用程序启动时加载的状态将由所有工作人员共享,直到他们修改它。
- Lazy-apps:在这种模式下,每个工作进程加载自己的应用程序,因此在我的代码上下文中,populate_info 将被每个工作进程调用。但这当然不是很有效的内存。
我发现这个 link 有用:https://engineering.ticketea.com/uwsgi-preforking-lazy-apps/
我想知道在具有多进程+线程的 uwsgi 上运行的 Flask 应用程序 运行 是否可以访问 Flask 应用程序中定义的公共内存数据结构 class。
我想做什么: 我有一个烧瓶应用程序,它将 运行 在 nginx + uwsgi 上。我希望每个 http 请求都能访问 etcd 数据库中的一些数据。但是,这很慢。为了加快 http 响应,我正在考虑在 flask 应用程序启动时将数据从 DB 加载到 flask 应用程序的内存中。因此,在每次请求时,都可以从本地内存中快速访问此数据,而不是询问 etcd。
我是如何尝试做到这一点的: 我已经定义了我自己的 Flaskapp class 并从 "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 运行s 烧瓶应用程序的方式。所以我需要回答:1)是否每个 uwsgi 进程都实例化了 Flask App? 2) 或者 uwsgi 在内存中实例化 Flask App 实例一次,在每个进程之间共享它,然后每个进程在每个请求上只调用该实例的 http 请求处理程序?我尝试搜索文档以了解 uwsgi 如何安排它,但找不到足够的信息来理解它。因此,将不胜感激任何帮助。如果这种内存共享不起作用(这是我的直觉),那么有什么替代方法可以做到这一点?谢谢
深入研究 uwsgi 文档后,我发现 uwsgi 有两种功能模式:
- 预分叉:这是默认模式。在这种模式下,一个主进程加载应用程序,然后从该主进程派生出工作进程。这导致工作人员拥有与主进程相同的内存,直到他们修改内存为止。在这种情况下遵循写时复制语义。所以在这种情况下,参考我的代码,我在应用程序启动时加载的状态将由所有工作人员共享,直到他们修改它。
- Lazy-apps:在这种模式下,每个工作进程加载自己的应用程序,因此在我的代码上下文中,populate_info 将被每个工作进程调用。但这当然不是很有效的内存。
我发现这个 link 有用:https://engineering.ticketea.com/uwsgi-preforking-lazy-apps/