web-dev-qa-db-ja.com

Gunicornでメモリを共有しますか?

私のWebサービスで使用する大きな読み取り専用データ構造(これは重要ではありませんが、networkxに読み込まれたグラフ)を持っています。 WebサービスはFlaskに組み込まれており、Gunicornを介して提供されます。私がスピンアップしたすべてのgunicornワーカーについて、機能した私のデータ構造の独自のコピーを保持していることがわかります。したがって、私の〜700mbデータ1つのワーカーで完全に管理可能な構造は、8つ実行するとかなり大きなメモリを消費します。gunicornプロセス間でこのデータ構造を共有できるので、それほど多くのメモリを無駄にする必要はありませんか?

27
Eli

これを行う最も簡単な方法は アプリケーションにプリロードするように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を使用して接続します。

15
Sean Vieira