Задать вопрос
@StickPunk

На чем лучше запускать сервер Flask с большой нагрузкой на CPU?

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

Пробовал gevent и eventlet в связке с gunicorn, но они либо поддерживают максимальное количество подключений равное количеству воркеров, что уже проблема. Либо если воркеров больше чем 1, то отваливается flask-socketio. Самый подходящий вариант сейчас это дефолтный threding режим и вынесение выполнения в flask-socketio start_background_task. Но, как я понимаю, в таком случае работает только 1 ядро.

Есть ли варианты как это правильно можно сделать? В документации flask-socketio нашел вариант с поднятием дополнительных экземпляров сервера и балансировкой через nginx, но оно не работает, сокеты отправляют запросы куда попало, а нужно чтобы 1 подключение оптарвляло все запросы только на 1 сервер.
  • Вопрос задан
  • 215 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 3
Mike_Ro
@Mike_Ro Куратор тега Python
Python, JS, WordPress, SEO, Bots, Adversting
Есть ли варианты как это правильно можно сделать?

Использовать Celery для выноса тяжелых задач в очередь, без блокирования основного потока Flask.
Ответ написан
AshBlade
@AshBlade
Просто хочу быть счастливым
Обычно, для CPU-bound задач подходит их вынесение в ОТДЕЛЬНЫЙ ПРОЦЕСС.
В питоне это через multiprocessing пакет (встроенный) можно сделать.
Ответ написан
Попробуйте запустить через uwsgi там можно настроить количество процессов, которые будет запускать flask и работать ему с потоками или нет. Также там можно выделить отдельный роут в отдельный воркер, так чтобы он работал изолированно от других. Возможно это то что вам нужно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Greenway Global Новосибирск
от 150 000 ₽
SPA2099 Москва
До 100 000 ₽
HR Prime Москва
от 300 000 до 3 800 000 ₽