Ответы:
Из документов :
$ celery -A proj purge
или
from proj.celery import app
app.control.purge()
(РЕДАКТИРОВАТЬ: Обновлено с текущим методом.)
redis-cli KEYS "celery*" | xargs redis-cli DEL
который работал для меня. Это уничтожит все задачи, хранящиеся в бэкэнде Redis, который вы используете.
celery purge
(внутри соответствующей виртуальной среды). Упс - есть ответ с тем же ниже ..... stackoverflow.com/a/20404976/1213425
-A
является приложение Django, в котором celery.py
находится.
Для сельдерея 3.0+:
$ celery purge
Чтобы очистить определенную очередь:
$ celery -Q queue_name purge
celery -A proj purge
.
Например, при использовании работника с параметром -Q для определения очередей
celery worker -Q queue1,queue2,queue3
тогда celery purge
не будет работать, потому что вы не можете передать ей параметры очереди. Будет удалена только очередь по умолчанию. Решение состоит в том, чтобы запустить ваших работников с --purge
параметром, подобным этому:
celery worker -Q queue1,queue2,queue3 --purge
Это, однако, запустить работника.
Другой вариант - использовать подкоманду ceq amqp
celery amqp queue.delete queue1
celery amqp queue.delete queue2
celery amqp queue.delete queue3
В сельдерее 3+:
CLI:
$ celery -A proj purge
Programatically:
>>> from proj.celery import app
>>> app.control.purge()
http://docs.celeryproject.org/en/latest/faq.html#how-do-i-purge-all-waiting-tasks
Я обнаружил, что celery purge
это не работает для моей более сложной конфигурации сельдерея. Я использую несколько именованных очередей для разных целей:
$ sudo rabbitmqctl list_queues -p celery name messages consumers
Listing queues ... # Output sorted, whitespaced for readability
celery 0 2
celery@web01.celery.pidbox 0 1
celery@web02.celery.pidbox 0 1
apns 0 1
apns@web01.celery.pidbox 0 1
analytics 1 1
analytics@web01.celery.pidbox 0 1
bcast.361093f1-de68-46c5-adff-d49ea8f164c0 0 1
bcast.a53632b0-c8b8-46d9-bd59-364afe9998c1 0 1
celeryev.c27b070d-b07e-4e37-9dca-dbb45d03fd54 0 1
celeryev.c66a9bed-84bd-40b0-8fe7-4e4d0c002866 0 1
celeryev.b490f71a-be1a-4cd8-ae17-06a713cc2a99 0 1
celeryev.9d023165-ab4a-42cb-86f8-90294b80bd1e 0 1
Первый столбец - это имя очереди, второй - количество сообщений, ожидающих в очереди, а третий - количество прослушивателей этой очереди. Очереди:
Задача аналитики - это грубые задачи, которые отлично работали с небольшими наборами данных, но теперь для их обработки требуется более 24 часов. Иногда, что-то идет не так, и он застревает в ожидании в базе данных. Его нужно переписать, но до тех пор, пока он не застрянет, я убиваю задачу, очищаю очередь и пытаюсь снова. Я обнаружил «застревание», просматривая количество сообщений для очереди аналитики, которое должно быть 0 (законченная аналитика) или 1 (ожидание завершения аналитики прошлой ночью). 2 или выше - плохо, и я получаю электронное письмо.
celery purge
предлагает стереть задачи из одной из широковещательных очередей, и я не вижу возможности выбрать другую именованную очередь.
Вот мой процесс:
$ sudo /etc/init.d/celeryd stop # Wait for analytics task to be last one, Ctrl-C
$ ps -ef | grep analytics # Get the PID of the worker, not the root PID reported by celery
$ sudo kill <PID>
$ sudo /etc/init.d/celeryd stop # Confim dead
$ python manage.py celery amqp queue.purge analytics
$ sudo rabbitmqctl list_queues -p celery name messages consumers # Confirm messages is 0
$ sudo /etc/init.d/celeryd start
celeryctl purge
не работал с именованными очередями. python manage.py celery amqp queue.purge <queue_name>
сделал. Я думаю, что контекст полезен для людей со сложными настройками, поэтому они могут выяснить, что им нужно делать, если celeryctl purge
у них не получается.
manage.py
в своем Celery 3.1.17, файл был удален или просто новый? Однако я нашел то, что выглядит как соответствующий интерфейс ( queue.purge
) */bin/amqp.py
. Но после попытки соотнести содержимое файла с документацией, я должен с сожалением признать, что Celery совершенно не документирован, а также является очень запутанным произведением, по крайней мере, судя по его исходному коду.
manage.py
скрипт управления Django, manage.py celery
запускающий сельдерей после загрузки конфигурации из настроек Django Я не использовал сельдерей за пределами Django, но включенная celery
команда может быть тем, что вы ищете: celery.readthedocs.org/en/latest/userguide/monitoring.html
В сельдерее 3+
http://docs.celeryproject.org/en/3.1/faq.html#how-do-i-purge-all-waiting-tasks
CLI
Очистить именованную очередь:
celery -A proj amqp queue.purge <queue name>
Очистить настроенную очередь
celery -A proj purge
Я удалил сообщения, но в очереди еще остались сообщения? Ответ: Задачи подтверждаются (удаляются из очереди), как только они фактически выполняются. После того, как работник получил задачу, до ее фактического выполнения потребуется некоторое время, особенно если много задач уже ожидает выполнения. Сообщения, которые не были подтверждены, удерживаются рабочим, пока он не закроет соединение с посредником (сервером AMQP). Когда это соединение закрыто (например, из-за того, что рабочий был остановлен), брокер будет повторно отправлять задачи следующему доступному рабочему (или тому же рабочему, когда оно будет перезапущено), поэтому для правильной очистки очереди ожидающих задач вы должны остановить всех рабочих, а затем очистить задачи с помощью celery.control.purge ().
Поэтому для очистки всей очереди работники должны быть остановлены.
Если вы хотите удалить все отложенные задачи, а также активные и зарезервированные задачи, чтобы полностью остановить Celery, это то, что сработало для меня:
from proj.celery import app
from celery.task.control import inspect, revoke
# remove pending tasks
app.control.purge()
# remove active tasks
i = inspect()
jobs = i.active()
for hostname in jobs:
tasks = jobs[hostname]
for task in tasks:
revoke(task['id'], terminate=True)
# remove reserved tasks
jobs = i.reserved()
for hostname in jobs:
tasks = jobs[hostname]
for task in tasks:
revoke(task['id'], terminate=True)
1. Чтобы правильно очистить очередь ожидающих заданий, вы должны остановить всех рабочих ( http://celery.readthedocs.io/en/latest/faq.html#i-ve-purged-messages-but-there-are- неподвижные сообщения, оставленные в очереди ):
$ sudo rabbitmqctl stop
или (если RabbitMQ / брокер сообщений управляется супервизором):
$ sudo supervisorctl stop all
2. ... и затем удалите задачи из определенной очереди:
$ cd <source_dir>
$ celery amqp queue.purge <queue name>
3. Запустите RabbitMQ:
$ sudo rabbitmqctl start
или (в случае, если RabbitMQ управляется Supervisor):
$ sudo supervisorctl start all
celery 4+ команда celery purge для очистки всех настроенных очередей задач
celery -A *APPNAME* purge
программно:
from proj.celery import app
app.control.purge()
все отложенные задачи будут удалены. Ссылка: celerydoc
manage.py celery purge
(celeryctl
теперь устарела и пропадет в 3.1).