当前位置: 首页 > 知识库问答 >
问题:

在GUnicorn/Flask应用程序中的进程之间共享静态全局数据

芮安顺
2023-03-14

我有一个Flask应用程序在Gunicorn下运行,使用同步工作进程类型和20个工作进程。该应用程序在启动时读取大量数据,这需要时间和内存。更糟糕的是,每个进程都加载自己的副本,这会导致它花费更长的时间,占用20倍的内存。数据是静态的,不会更改。我想加载一次,让所有20名员工共享。

如果我使用preload_app设置,它只加载在一个线程中,并且最初只需要1X内存,但是一旦请求开始进来,它似乎会变成20X。我需要快速随机访问数据,所以我宁愿不做IPC。

有没有办法在GUnicorn进程之间共享静态数据?

共有2个答案

郎嘉树
2023-03-14

假设您的首要任务是将数据保持为Python数据结构,而不是将其移动到Redis之类的数据库中,那么您必须进行更改,以便可以为服务器使用单个进程。

Gunicorn可以与gevent一起使用协同路由创建一个服务器,该服务器可以支持单个工作进程中的多个客户端,这可能是满足您需求的一个好选择。

孟栋
2023-03-14

内存映射文件将允许您在进程之间共享页面。

https://docs.python.org/3/library/mmap.html

请注意,内存消耗统计数据通常具有误导性,而且没有帮助。通常考虑VMSTAT的输出,看看你是否交换了很多。

 类似资料:
  • 问题内容: 我只想在进程与该进程调用的dll之间共享静态/全局变量。exe和dll在相同的内存地址空间中。我不希望在其他进程之间共享该变量。 问题的阐述: 说是有一个静态/全局变量在。exe 和dll 都具有,因此变量都在两个图像中。 现在,动态加载(或静态)。然后,问题是该变量是否由exe和dll共享。 在Windows中,这两个家伙 永远不会 共享:exe和dll将具有的单独副本。但是,在Li

  • 问题内容: 我正在使用flask,并尝试执行以下操作。 我已经定义了一个main.py文件,通过它我可以运行我的应用程序,即 我定义了一个名为view的程序包,在其中将声明不同的view模块,每个模块都有自己的路由。 因此,我需要在main.py中具有用于运行服务器的全局应用程序对象,以及在包的视图类中用于注册路由的全局对象。那么,如何创建全局应用程序对象并在所有类之间共享呢? 问题答案: 可以从

  • 问题内容: 我想不,不是,因为每个进程当然都有自己的内存空间。 但是整个JVM实际如何工作?我启动的每个Java程序在单独的进程中是否都有单独的JVM?系统中运行的Java程序是否共享任何东西?操作系统和JVM实现之间有区别吗?是否可以 使 程序共享变量(即直接通过JVM而不是通常的IPC机制)?是否有更多特殊用途的单进程JVM? 通常,关于JVM胆量的推荐读物是什么?该规范?一些实现的源代码?网

  • 问题内容: 我正在尝试在应用程序中保存缓存字典。 据我了解,应使用Application Context,尤其是flask.g对象。 设定: 现在,如果我这样做: 它打印。 继续执行以下操作: 我不明白,文档也完全没有帮助。如果我正确阅读它们,状态应该已经保留。 我的另一个想法是简单地使用模块范围的变量: 但是似乎这些随着每个请求而重置。 如何正确做到这一点? 编辑:flask10.1 问题答案:

  • 问题内容: 在我的应用中,公共对象的状态通过发出请求来更改,而响应取决于状态。 如果我在开发服务器上运行此程序,则期望得到1、2、3等。如果同时从100个不同的客户发出请求,会出问题吗?预期结果将是100个不同的客户端各自看到一个从1到100的唯一数字。或者会发生以下情况: 客户端1查询。增加1。 在执行return语句之前,线程将切换到客户端2。再次递增。 线程切换回客户端1,并向客户端返回数字

  • 我是一个新的React Native,我正在尝试改变一个位于一个屏幕中的类组件中的算术函数的状态,然后在全局共享它,以便在不同的屏幕中使用它,并且可能改变它,有哪些方法可以做到这一点?