Как лучше всего реализовать пул рабочих процессов, совместимых с Gevent?
-
27-10-2019 - |
Вопрос
Сценарий
У меня есть серверный процесс, реализованный в Python и Gevent, который подключается к бэкэнд -сервису по TCP/IP и обслуживает многих веб -клиентов (~ 1000 за процесс) с быстро меняющимся динамическим содержанием на основе изменений, внесенных в сервисную службу. Сервис работает на Ubuntu 10.04 и не работает в Windows, поэтому целевая платформа установлена. Мы используем Python 2.6.6, в настоящее время.
Проблема
Обслуживание изменений для того, что многие клиенты могут вызвать отставание при обработке изменений, отправленных бэкэндом, поэтому мой план состоит в том, чтобы разделить сервер на несколько процессов. Ряд рабочих процессов будет обслуживать веб -клиентов, в то время как основной процесс все равно будет подключен к сервису. Я уже использую отдельный пул Greenlets для обслуживания веб -клиентов, но их нужно помещать в рабочие процессы.
Вопрос
Не могли бы вы указать мне на реализацию пула рабочих процессов для Gevent или выяснить, как я могу использовать собственный многопроцессный модуль Python с правильным образом?
Ограничения
Я хотел бы избежать введения потоков Python в наши процессы, поскольку это дало бы место для раздора GIL, что снизило бы производительность задержкой. Таким образом, это было бы чистое многопроцессорное решение + Gevent, если это возможно.
Решение
Я рекомендую взглянуть на Сельдерей - Распределенная система обработки задач, написанная на Python.
Основная идея с celery
это то, что у вас есть очередь (либо RabbitMQ
или же Redis
), с работниками, написанными как процессы Python, и выставлены через celeryd
демон. Согласно документации по сельдерею, celeryd
Поддерживает работу gevent
Режим также (для процессов, связанных с сетью ввода -вывода), поэтому, по -видимому, ваш код работника не нуждается в большой модификации для запуска в этой среде.
Другие советы
Я бы рассмотрел пользовательский сокет IPC или использование ZeromQ.