Параллельное выполнение с Eventlet
Введение
На главной странице Eventlet описывается как библиотека для параллельных сетевых операций на Python, которая позволяет изменить способ выполнения кода, но не способ его написания.
Для высокопроизводительного неблокирующего ввода-вывода она использует epoll(4) или libevent.
Сопрограммы позволяют разработчику использовать блокирующий стиль программирования, похожий на многопоточность, но при этом обеспечивают преимущества неблокирующего ввода-вывода.
Диспетчеризация событий выполняется неявно: это означает, что Eventlet легко использовать в интерпретаторе Python или в качестве небольшой части более крупного приложения.
Celery поддерживает Eventlet как альтернативную реализацию пула выполнения, которая в некоторых случаях превосходит prefork. Однако необходимо следить за тем, чтобы одна задача не блокировала цикл событий слишком долго. Как правило, Eventlet плохо подходит для операций, интенсивно использующих процессор. Также учтите, что некоторые библиотеки, обычно содержащие расширения на C, нельзя подвергнуть monkey patching, поэтому они не смогут воспользоваться преимуществами Eventlet. Если вы не уверены, обратитесь к документации соответствующей библиотеки. Например, pylibmc не поддерживает совместную работу с Eventlet, а psycopg2 поддерживает, хотя обе библиотеки содержат расширения на C.
Пул prefork может использовать несколько процессов, но их число часто ограничено несколькими процессами на процессор. С Eventlet можно эффективно запускать сотни и даже тысячи green threads. В неформальном тесте с системой агрегации новостных лент пул Eventlet мог получать и обрабатывать сотни лент в секунду, тогда как пул prefork потратил 14 секунд на обработку 100 лент. Учтите, что это одна из задач, для которых асинхронный ввод-вывод особенно эффективен (асинхронные HTTP-запросы). Можно одновременно использовать рабочие процессы Eventlet и prefork и направлять задачи в зависимости от совместимости или того, какой вариант работает лучше.
Включение Eventlet
Включить пул Eventlet можно с помощью параметра worker celery worker -P.
$ celery-Aprojworker-Peventlet-c1000
Примеры
Примеры использования поддержки Eventlet см. в каталоге примеров Eventlet в дистрибутиве Celery.
Copyright © 2017-2026 Asif Saif Uddin, core team & contributors. All rights reserved.
Celery is licensed under The BSD License (3 Clause, also known as the new BSD license). The license is an OSI approved Open Source license and is GPL-compatible.
https://docs.celeryq.dev/en/stable/userguide/concurrency/eventlet.html