Каков наилучший способ реализовать пул рабочих процессов, совместимых с Gevent? - PullRequest
2 голосов
/ 19 марта 2011

Сценарий

У меня есть серверный процесс, реализованный на Python и gevent, который подключается к серверной службе через TCP / IP и обслуживает множество веб-клиентов (~ 1000 на процесс) с быстро меняющимся динамическим содержимым на основе изменений, внесенных серверной службой , Служба работает в Ubuntu 10.04 и не будет работать в Windows, поэтому целевая платформа исправлена. В настоящее время мы используем Python 2.6.6.

Задача

Обслуживание изменений для многих клиентов может привести к задержке в обработке изменений, отправленных бэкэндом, поэтому я планирую разделить сервер на несколько процессов. Ряд рабочих процессов будет обслуживать веб-клиентов, в то время как основной процесс все еще будет подключен к бэкэнд-службе. Я уже использую отдельный пул гринлетов для обслуживания веб-клиентов, но их необходимо включить в рабочие процессы.

Вопрос

Не могли бы вы указать мне на реализацию пула рабочих процессов для gevent или выяснить, как я могу использовать собственный многопроцессорный модуль Python с gevent правильным способом?

Ограничения

Я бы не хотел вводить потоки Python в наши процессы, поскольку это дало бы место для конкуренции GIL, что снизило бы производительность за счет задержки. Так что, если возможно, это будет чистое многопроцессорное решение + Gevent.

Ответы [ 2 ]

2 голосов
/ 13 июля 2011

Я бы подумал о собственном сокете IPC или использовании ZeroMQ.

1 голос
/ 19 марта 2011

Я рекомендую взглянуть на Celery - распределенную систему обработки задач, написанную на Python.

Основная идея с celery состоит в том, что у вас есть очередь (RabbitMQ или Redis), с рабочими, написанными как процессы Python и выставленными через демон celeryd. Согласно документации по сельдерею, celeryd также поддерживает работу в режиме gevent (для процессов, связанных с сетевым вводом / выводом), поэтому, вероятно, ваш рабочий код не потребует особых изменений для запуска в этой среде.

...