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

Совместное использование статических глобальных данных среди процессов в приложении Gunicorn/Flask

У меня есть приложение Flask, работающее под Gunicorn, с использованием рабочего типа sync с 20 рабочими процессами. Приложение считывает много данных о запуске, что требует времени и использует память. Хуже того, каждый процесс загружает свою собственную копию, что заставляет ее занять еще больше времени и займет 20X памяти. Данные статичны и не меняются. Я хотел бы загрузить его один раз, и все 20 сотрудников будут делиться им.

Если я использую параметр preload_app, он загружается только в одном потоке и изначально занимает только 1X-память, но затем кажется, что он равен 20X после начала запроса. Мне нужен быстрый случайный доступ к данным, поэтому я 'd скорее не делать IPC.

Есть ли способ поделиться статическими данными между процессами Gunicorn?

4b9b3361

Ответ 1

Файлы с отображением памяти позволят вам обмениваться страницами между процессами.

https://docs.python.org/2/library/mmap.html

Обратите внимание, что статистика потребления памяти обычно вводит в заблуждение и бесполезна. Обычно лучше рассмотреть вывод vmstat и посмотреть, много ли вы меняете.

Ответ 2

Предполагая, что ваш приоритет состоит в том, чтобы сохранить данные как структуру данных Python, а не перемещать их в базу данных, такую ​​как Redis, тогда вам придется изменить ситуацию, чтобы вы могли использовать один процесс для своего сервера.

Gunicorn может работать с gevent для создания сервера, который может поддерживать несколько клиентов в рамках одного рабочего процесса, используя сопрограммы, которые могут быть хороший вариант для ваших нужд.