Видалення всіх відкладених завдань у селері / кролиці


Відповіді:


297

З документів :

$ celery -A proj purge

або

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

(EDIT: оновлено поточним методом.)


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

3
Я знайшов цю відповідь, шукаючи, як це зробити за допомогою бекенда Redis. Найкращий метод, який я знайшов - це, redis-cli KEYS "celery*" | xargs redis-cli DELякий працював на мене. Це знищить усі завдання, які зберігаються у застосунку Redis, який ви використовуєте.
Melignus

1
Як я можу це зробити в селері 3.0?
luistm

2
Для мене це було просто celery purge(всередині відповідної віртуальної програми). За електронній пошті Ой - є відповідь з тим же нижче ..... stackoverflow.com/a/20404976/1213425
Erve1879

Для Celery 4.0+ у поєднанні з Django це знову ця команда, де аргументом -Aє додаток Django, де celery.pyзнаходиться.
gitaarik

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

Однак це запустить працівника.

Інший варіант - використовувати підкоманду 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, не зовсім настільки потужна
  • analytics - Черга на тривалі нічні аналітики
  • * .pidbox - Черга для робочих команд, таких як відключення та скидання, одна на одного працівника (2 працівники селери, один працівник apns, один працівник аналітики)
  • bcast. * - трансляція черг для надсилання повідомлень усім працівникам, які слухають чергу (а не лише першим, хто її захопив)
  • celeryev. * - черги подій селери, для звітування про аналітику завдань

Завдання аналітики - це грубі завдання, які чудово працювали на невеликих наборах даних, але зараз на обробку потрібно більше 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

Не відповідь, правда? Однак дуже інформативно!
amn

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

Я не можу знайти manage.pyв моїй селері 3.1.17, чи видалено файл чи просто новий? Однак я виявив схожий на відповідний інтерфейс ( queue.purge) */bin/amqp.py. Але, намагаючись співвіднести вміст файлу з документацією, я мушу, на жаль, визнати, що селера страшенно недокументована, а також дуже складною роботою, принаймні судячи про це за її вихідним кодом.
amn

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

Якщо ви хочете видалити всі очікувані завдання, а також активні та зарезервовані, щоб повністю зупинити селеру, це для мене спрацювало:

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 / брокер повідомлень керує Supervisor):

$ sudo supervisorctl stop all

2. ... а потім очистіть завдання з певної черги:

$ cd <source_dir>
$ celery amqp queue.purge <queue name>

3. Запустіть RabbitMQ:

$ sudo rabbitmqctl start

або (у випадку, якщо RabbitMQ керує Супервізор):

$ sudo supervisorctl start all

2

команда очищення селери 4+ для очищення всіх налаштованих черг завдань

celery -A *APPNAME* purge

програмно:

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

все завдання, що очікує, буде очищено. Довідка: селеродок

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.