Python 在Gunicorn中共享内存?

Python 在Gunicorn中共享内存?,python,flask,networkx,gunicorn,Python,Flask,Networkx,Gunicorn,我在web服务中使用了一个大型只读数据结构(一个加载在networkx中的图形,尽管这并不重要)。Web服务构建在烧瓶中,然后通过Gunicorn提供。事实证明,对于我所提拔的每一位gunicorn员工,他们都拥有自己的数据结构副本。因此,我的~700mb数据结构在一个工作区内完全可以管理,当我运行其中8个工作区时,它会变成一个相当大的内存消耗。有没有办法在gunicorn进程之间共享此数据结构,这样就不必浪费太多内存?看起来最简单的方法就是使用该选项。这假设您可以将数据结构作为模块级变量加载:

我在web服务中使用了一个大型只读数据结构(一个加载在networkx中的图形,尽管这并不重要)。Web服务构建在烧瓶中,然后通过Gunicorn提供。事实证明,对于我所提拔的每一位gunicorn员工,他们都拥有自己的数据结构副本。因此,我的~700mb数据结构在一个工作区内完全可以管理,当我运行其中8个工作区时,它会变成一个相当大的内存消耗。有没有办法在gunicorn进程之间共享此数据结构,这样就不必浪费太多内存?

看起来最简单的方法就是使用该选项。这假设您可以将数据结构作为模块级变量加载:

from flask import Flask
from your.application import CustomDataStructure

CUSTOM_DATA_STRUCTURE = CustomDataStructure('/data/lives/here')

# @app.routes, etc.

或者,您可以使用(如果您可以使用自定义数据结构包装共享内存)来确保您只使用一个进程,或者使用IPC连接到一个进程。

您是否考虑过使用Redis之类的工具来存储数据并从每个进程访问数据?就速度而言,它与共享内存非常相似。我会的,但我们讨论的是一个复杂的图形,在Redis中没有简单的存储方法(Redis目前没有定向边图或通用图形支持AFAIK)。这个解决方案对您有效吗?如果是,你能告诉我详细的情况,你是怎么做到的吗?预加载选项不起作用,你能提供一些如何将其用于虚拟数据结构的示例吗?@neel-你最好再问一个问题,比如你的设置和什么不起作用。我已经在这里发布了这个问题,如果你看一次就好了。提前感谢。这本书读得很好,虽然在使用Uvicorn worker时没有帮助我捕获父进程,但我成功地找到了一个我认为比预加载方法更干净的解决方案,它使用了一个用于gunicorn的python配置文件<代码>-c gconfig.py