私のWebサービスで使用する大きな読み取り専用データ構造(これは重要ではありませんが、networkxに読み込まれたグラフ)を持っています。 WebサービスはFlaskに組み込まれており、Gunicornを介して提供されます。私がスピンアップしたすべてのgunicornワーカーについて、機能した私のデータ構造の独自のコピーを保持していることがわかります。したがって、私の〜700mbデータ1つのワーカーで完全に管理可能な構造は、8つ実行するとかなり大きなメモリを消費します。gunicornプロセス間でこのデータ構造を共有できるので、それほど多くのメモリを無駄にする必要はありませんか?
これを行う最も簡単な方法は アプリケーションにプリロードするようにgunicornに伝える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 を使用して、 oneprocess、または 独自のデータ構造サーバーを起動するマルチプロセッシングモジュール IPCを使用して接続します。