Как удалить все ожидающие задачи, не зная task_id
для каждой задачи?
Удаление всех ожидающих задач в сельдере/кроличнике
Ответ 1
Из docs:
$ celery -A proj purge
или
from proj.celery import app
app.control.purge()
(EDIT: Обновлено текущим методом.)
Ответ 2
Для сельдерея 3.0 +:
$ celery purge
Чтобы очистить определенную очередь:
$ celery -Q queue_name purge
Ответ 3
Для сельдерея 2.x и 3.x:
При использовании рабочего с параметром -Q для определения очередей, например
celery worker -Q queue1,queue2,queue3
то celery purge
не будет работать, потому что вы не можете передать ему параметры очереди. Он удалит только очередь по умолчанию.
Решение состоит в том, чтобы запустить своих работников с параметром --purge
следующим образом:
celery worker -Q queue1,queue2,queue3 --purge
Однако это приведет к выполнению работника.
Другой вариант - использовать подкоманду amqp сельдерея
celery amqp queue.delete queue1
celery amqp queue.delete queue2
celery amqp queue.delete queue3
Ответ 4
В сельдерей 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
Ответ 5
Я обнаружил, что celery purge
не работает для моей более сложной конфигурации celery. Я использую несколько именованных очередей для разных целей:
$ sudo rabbitmqctl list_queues -p celery name messages consumers
Listing queues ... # Output sorted, whitespaced for readability
celery 0 2
[email protected] 0 1
[email protected] 0 1
apns 0 1
[email protected] 0 1
analytics 1 1
[email protected] 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
Первый столбец - это имя очереди, второе - количество ожидающих в очереди сообщений, а третье - количество слушателей для этой очереди. Очереди:
- сельдерей - очередь для стандартных, идемпотентных задач сельдерея.
- apns - очередь для задач Apple Push Notification Service, не совсем как idempotent
- analytics - Очередь для долгой ночной аналитики
- *. pidbox - очередь для рабочих команд, таких как shutdown и reset, по одному на каждого работника (2 работника сельдерея, один рабочий, один аналитик)
- bcast. * - очереди широковещания, для отправки сообщений всем слушателям, которые слушают очередь (а не только первыми, чтобы их захватить).
- ceralev. * - очереди событий Celery, для отчета о анализе задач
Задача аналитики - это задачи грубой силы, которые отлично работали на небольших наборах данных, но теперь для обработки требуется более 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
Ответ 6
В сельдерее 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().
Поэтому для очистки всей очереди работники должны быть остановлены.
Ответ 7
1. Чтобы правильно очистить очередь ожидающих задач, вы должны остановить всех рабочих (http://celery.readthedocs.io/en/latest/faq.html#i-ve-purged-messages-but-there-are-still-messages-left-in-the-queue):
$ sudo rabbitmqctl stop
или (в случае, если RabbitMQ/брокер сообщений управляется Супервизором):
$ sudo supervisorctl stop all
2. ... и затем очистить задачи из определенной очереди:
$ cd <source_dir>
$ celery amqp queue.purge <queue name>
3. Запустить RabbitMQ:
$ sudo rabbitmqctl start
или (в случае, если RabbitMQ управляется супервизором):
$ sudo supervisorctl start all
Ответ 8
команда celery 4+ celery purge для очистки всех настроенных очередей задач
celery -A *APPNAME* purge
программно:
from proj.celery import app
app.control.purge()
все отложенные задачи будут удалены. Ссылка: celerydoc
Ответ 9
Если вы хотите удалить все отложенные задачи, а также активные и зарезервированные задачи, чтобы полностью остановить 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)