Удаление всех ожидающих задач в сельдере/кроличнике

Как удалить все ожидающие задачи, не зная 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

Ответ 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)