2015-09-01 4 views
0

У меня есть проект Django + Celery. Одна из задач Celery выполняет множество небольших HTTP-запросов, используя библиотеку запросов, в то время как другие делают много разговоров с базой данных через ORM Django. Задача HTTP-тяжелая уже запущена в своем собственном работнике сельдерея, используя собственную очередь сельдерея. Я хочу, чтобы HTTP-тяжелый рабочий использовал eventlet, оставив остальные задачи использовать пул выполнения предпросмотра. Как мне это сделать?Django + Celery + Requests + Eventlet

Celery docs похоже, что я получаю магические силы параллелизма, просто запустив celery ... -P eventlet. Тем не менее, this SO answer говорит, что мне нужно использовать исправленную версию библиотеки запросов. Что правильно? Кроме того, если я должен явно исправлять запросы, должен ли я ставить эту задачу в отдельный модуль из остальных обычных задач, чтобы эти другие задачи могли продолжать использовать обычную версию запросов?

ответ

1

TL, DR: используйте исправленную версию библиотеки запросов. Нет необходимости запускать отдельный модуль.

celery -P eventlet дает вам параллелизм работы сельдерея. Они могут или не могут позвонить eventlet.monkey_patch(), чтобы сделать весь код совместимым. Они могут также изменить его в будущем. Явно использование исправленной версии устраняет двусмысленность, а также предоставляет полезную документацию.

Нельзя отделять параллельные requests от блокировки. Ваш пул предков может также использовать параллельную версию. Событие не отравляет вещи чем-то плохим.

+0

спасибо. Таким образом, похоже, что если вы используете исправленные запросы за пределами цикла eventlet, он работает отлично, а IO блокирует то, как он работает с ванильными запросами. – ipartola

Смежные вопросы