Відповіді:
З документів :
$ celery -A proj purge
або
from proj.celery import app
app.control.purge()
(EDIT: оновлено поточним методом.)
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
Однак це запустить працівника.
Інший варіант - використовувати підкоманду amqp селери
celery amqp queue.delete queue1
celery amqp queue.delete queue2
celery amqp queue.delete queue3
У селері 3+:
CLI:
$ celery -A proj purge
Програматично:
>>> 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
в моїй селері 3.1.17, чи видалено файл чи просто новий? Однак я виявив схожий на відповідний інтерфейс ( queue.purge
) */bin/amqp.py
. Але, намагаючись співвіднести вміст файлу з документацією, я мушу, на жаль, визнати, що селера страшенно недокументована, а також дуже складною роботою, принаймні судячи про це за її вихідним кодом.
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 ().
Тож для очищення всіх черг працівників потрібно зупинити.
Якщо ви хочете видалити всі очікувані завдання, а також активні та зарезервовані, щоб повністю зупинити селеру, це для мене спрацювало:
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 / брокер повідомлень керує 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
команда очищення селери 4+ для очищення всіх налаштованих черг завдань
celery -A *APPNAME* purge
програмно:
from proj.celery import app
app.control.purge()
все завдання, що очікує, буде очищено. Довідка: селеродок
manage.py celery purge
(celeryctl
тепер застаріле і піде в 3.1).