在Gunicorn分享记忆?

时间:2014-12-02 01:14:37

标签: python flask networkx gunicorn

我有一个大的只读数据结构(在networkx中加载的图形,虽然这不应该是重要的)我在我的Web服务中使用。 Web服务是在Flask中构建的,然后通过Gunicorn提供服务。事实证明,对于我旋转的每个枪支工作者来说,这个工作都拥有我自己的数据结构副本。因此,当我有8个运行时,我的~700mb数据结构可以完全由一个工人管理,变成了一个非常大的内存。有什么方法可以在gunicorn进程之间共享这个数据结构,所以我不必浪费那么多内存吗?

1 个答案:

答案 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