Подтвердить что ты не робот

Совместное использование памяти в Gunicorn?

У меня есть большая структура данных только для чтения (график, загруженный в networkx, хотя это не должно быть важно), который я использую в своей веб-службе. Вебсервис построен в Flask, а затем подается через Gunicorn. Оказывается, для каждого рабочего-стрелялка я раскручиваюсь, у него работает собственная копия моей структуры данных. Таким образом, моя структура данных размером ~ 700 Мб, которая отлично управляема с одним рабочим, превращается в довольно крупную память, когда у меня есть 8 из них. Есть ли способ поделиться этой структурой данных между процессами пушки, так что мне не нужно тратить столько памяти?

4b9b3361

Ответ 1

Похоже, что самый простой способ сделать это - сообщить gunicorn для предварительной загрузки вашего приложения с помощью preload_app. Это предполагает, что вы можете загрузить структуру данных в виде переменной уровня модуля:

from flask import Flask
from your.application import CustomDataStructure

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

# @app.routes, etc.

В качестве альтернативы вы можете использовать файл с отображением памяти (если вы можете обернуть разделяемую память своей пользовательской структурой данных), gevent with gunicorn, чтобы убедиться, что вы используете только один процесс, или модуль мультипроцессорной обработки, чтобы развернуть свой собственный сервер структуры данных, который вы подключаетесь к IPC.