workers app_module python flask networkx gunicorn

python - app_module - gunicorn timeout configuration



¿Compartiendo memoria en Gunicorn? (1)

Tengo una gran estructura de datos de solo lectura (un gráfico cargado en networkx, aunque esto no debería ser importante) que uso en mi servicio web. El servicio web se construye en Flask y luego se sirve a través de Gunicorn. Resulta que por cada trabajador gunicornio que gire, el que funciona tiene su propia copia de mi estructura de datos. Por lo tanto, mi estructura de datos de ~ 700 mb, que es perfectamente manejable con un solo trabajador, se convierte en un montón de memoria bastante grande cuando tengo 8 de ellos en ejecución. ¿Hay alguna forma en que pueda compartir esta estructura de datos entre los procesos de Gunicorn para que no tenga que desperdiciar tanta memoria?


Parece que la forma más fácil de hacerlo es decirle a gunicorn que cargue tu aplicación con la opción preload_app . Esto supone que puede cargar la estructura de datos como una variable de nivel de módulo:

from flask import Flask from your.application import CustomDataStructure CUSTOM_DATA_STRUCTURE = CustomDataStructure(''/data/lives/here'') # @app.routes, etc.

Alternativamente, puede usar un archivo asignado en memoria (si puede envolver la memoria compartida con su estructura de datos personalizada), gevent con gunicorn para asegurarse de que solo está usando un proceso , o el módulo de multiprocesamiento para girar su propio servidor de estructura de datos con el que se conecta usando IPC.