我有一个大的只读数据结构(在networkx中加载的图形,虽然这不应该是重要的)我在我的Web服务中使用。 Web服务是在Flask中构建的,然后通过Gunicorn提供服务。事实证明,对于我旋转的每个枪支工作者来说,这个工作都拥有我自己的数据结构副本。因此,当我有8个运行时,我的~700mb数据结构可以完全由一个工人管理,变成了一个非常大的内存。有什么方法可以在gunicorn进程之间共享这个数据结构,所以我不必浪费那么多内存吗?
答案 0 :(得分:10)
看起来最简单的方法是tell gunicorn to preload your application使用preload_app
选项。这假设您可以将数据结构作为模块级变量加载:
from flask import Flask
from your.application import CustomDataStructure
CUSTOM_DATA_STRUCTURE = CustomDataStructure('/data/lives/here')
# @app.routes, etc.
或者,您可以使用memory-mapped file(如果您可以使用自定义数据结构包装共享内存)gevent with gunicorn,以确保您只使用一个进程,或使用IPC连接的the multi-processing module to spin up your own data-structure server。