Я хотел бы использовать Celery в качестве очереди для моих задач, чтобы мое веб-приложение могло поставить задачу в очередь, вернуть ответ, и задача будет обработана тем временем / когда-нибудь / ... Я создаю своего рода API, поэтому я не знать, какие задачи будут там, заранее - в будущем могут быть задачи, связанные с HTTP-запросами, другим вводом-выводом, а также задачами, потребляющими ресурсы ЦП. В связи с этим я бы хотел запустить рабочих Celery на процессах, поскольку это универсальный вид параллелизма в Python.
Однако я бы тоже хотел использовать gevent в своих задачах, чтобы у меня была одна задача, порождающая множество HTTP-запросов и т. Д. Проблема в том, когда я делаю это:
from gevent import monkey
monkey.patch_all()
Сельдерей перестает работать. Он запускается, но никакие задачи не могут быть эффективно поставлены в очередь - они, кажется, переходят к брокеру, но работник Celery не собирает и не обрабатывает их. Только запускается и ждет. Если я удалю эти строки и выполню задачу без gevent и распараллеливания, все заработает.
Я думаю, это может быть связано с тем, что патчи gevent также работают с потоками. Так что я попробовал
from gevent import monkey
monkey.patch_all(thread=False)
... но тогда Celery даже не запускается, он вылетает без объяснения причин (включен уровень отладки логирования).
Можно ли использовать Celery для постановки задач в очередь, а gevent - для выполнения каких-то действий внутри одной задачи? Как? Что я делаю не так?
gevent.joinall()
Думаю, самая большая проблема с этим - это очистить потом. AFAIK вы не можете временно исправить, процесс должен оставаться исправленным навсегда. - person asksol   schedule 12.11.2012gevent.joinall()
. - person Honza Javorek   schedule 12.11.2012