Удаление всех нерешенных задач в сельдерее / rabbitmq


Ответы:


297

Из документов :

$ celery -A proj purge

или

from proj.celery import app
app.control.purge()

(РЕДАКТИРОВАТЬ: Обновлено с текущим методом.)


56
Или, от Django, для сельдерея 3.0+: manage.py celery purge( celeryctlтеперь устарела и пропадет в 3.1).
Хенрик Хаймбюргер

3
Я нашел этот ответ в поисках того, как сделать это с помощью Redis Backend. Лучший метод, который я нашел, был, redis-cli KEYS "celery*" | xargs redis-cli DELкоторый работал для меня. Это уничтожит все задачи, хранящиеся в бэкэнде Redis, который вы используете.
Мелиньус,

1
Как я могу сделать это в сельдерее 3.0?
luistm

2
Для меня это было просто celery purge(внутри соответствующей виртуальной среды). Упс - есть ответ с тем же ниже ..... stackoverflow.com/a/20404976/1213425
Erve1879

Для Celery 4.0+ в сочетании с Django это снова эта команда, аргументом которой -Aявляется приложение Django, в котором celery.pyнаходится.
Гитаарик

120

Для сельдерея 3.0+:

$ celery purge

Чтобы очистить определенную очередь:

$ celery -Q queue_name purge

9
Если вы получаете ошибки подключения, убедитесь, что вы указали приложение, например celery -A proj purge.
Камил Синди

25

Для сельдерея 2.x и 3.x:

Например, при использовании работника с параметром -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

Да, это для более старых (2.x и, возможно, 3.x) версий сельдерея. Я не могу изменить ответ
smido


9

Я обнаружил, что 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

Первый столбец - это имя очереди, второй - количество сообщений, ожидающих в очереди, а третий - количество прослушивателей этой очереди. Очереди:

  • сельдерей - Очередь для стандартных, идемпотентных задач сельдерея
  • apns - очередь задач Apple Push Notification Service, не совсем идемпотентная
  • аналитика - Очередь за продолжительной ночной аналитикой
  • * .pidbox - Очередь для рабочих команд, таких как выключение и сброс, по одной на каждого работника (2 сельдерея, один работник apns, один аналитик)
  • bcast. * - Широковещательные очереди, для отправки сообщений всем работникам, прослушивающим очередь (а не только первым, кто ее получил)
  • celeryev. * - Очереди событий 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

Не ответ, правда? Однако очень информативно!
атп

4
celeryctl purgeне работал с именованными очередями. python manage.py celery amqp queue.purge <queue_name>сделал. Я думаю, что контекст полезен для людей со сложными настройками, поэтому они могут выяснить, что им нужно делать, если celeryctl purgeу них не получается.
jwhitlock

Я не могу найти 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
jwhitlock

5

В сельдерее 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 ().

Поэтому для очистки всей очереди работники должны быть остановлены.


5

Если вы хотите удалить все отложенные задачи, а также активные и зарезервированные задачи, чтобы полностью остановить 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)

2

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

2

celery 4+ команда celery purge для очистки всех настроенных очередей задач

celery -A *APPNAME* purge

программно:

from proj.celery import app
app.control.purge()

все отложенные задачи будут удалены. Ссылка: celerydoc

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.