Конкурентность с Eventlet¶
Введение¶
Домашняя страница Eventlet описывает его как библиотеку параллельных сетей для Python, которая позволяет вам изменить то, как вы выполняете свой код, а не то, как вы его пишете.
Он использует epoll(4) или libevent для highly scalable non-blocking I/O.
Coroutines убедитесь, что разработчик использует блокирующий стиль программирования, который похож на потоковый, но обеспечивает преимущества неблокирующего ввода-вывода.
Диспетчеризация событий является неявной: это означает, что вы можете легко использовать Eventlet из интерпретатора Python или в качестве небольшой части более крупного приложения.
Celery поддерживает Eventlet в качестве альтернативной реализации пула исполнения и в некоторых случаях превосходит prefork. Однако необходимо следить за тем, чтобы одна задача не блокировала цикл событий слишком долго. Как правило, операции, привязанные к процессору, не очень хорошо сочетаются с Eventlet. Также обратите внимание, что некоторые библиотеки, обычно с расширениями C, не могут быть monkeypatched и поэтому не могут получить преимущества от использования Eventlet. Если вы не уверены, обратитесь к их документации. Например, pylibmc не позволяет работать с Eventlet, а psycopg2 позволяет, если обе они являются библиотеками с расширениями C.
Пул prefork может использовать несколько процессов, но их количество часто ограничено несколькими процессами на процессор. С Eventlet вы можете эффективно порождать сотни или тысячи зеленых потоков. В неофициальном тесте с системой feed hub пул Eventlet мог получать и обрабатывать сотни фидов каждую секунду, в то время как пул prefork тратил 14 секунд на обработку 100 фидов. Обратите внимание, что это одно из приложений, в котором асинхронный ввод-вывод особенно хорош (асинхронные HTTP-запросы). Вам может понадобиться сочетание рабочих Eventlet и prefork, и распределяйте задачи в зависимости от совместимости или того, что лучше работает.
Включение эвентлета¶
Вы можете включить пул эвентлетов, используя опцию celery worker -P
worker.
$ celery -A proj worker -P eventlet -c 1000
Примеры¶
Смотрите каталог Eventlet examples в дистрибутиве Celery для некоторых примеров, использующих поддержку Eventlet.