Kereviz / rabbitmq'ta bekleyen tüm görevleri silme


Yanıtlar:


297

Gönderen docs :

$ celery -A proj purge

veya

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

(EDIT: Mevcut yöntemle güncellendi.)


56
Veya, Django'dan, kereviz 3.0+ için: manage.py celery purge( celeryctlşimdi kullanımdan kaldırıldı ve 3.1'de gidecek).
Henrik Heimbuerger

3
Bu cevabı, bunun bir redis arka ucuyla nasıl yapılacağını ararken buldum. Bulduğum en iyi yöntem benim redis-cli KEYS "celery*" | xargs redis-cli DELiçin işe yaradı. Bu, kullandığınız yeniden arka uçta depolanan tüm görevleri silecektir.
Melignus

1
Bunu kereviz 3.0'da nasıl yapabilirim?
luistm

2
Benim için, basitçe celery purge(ilgili sanal çevrenin içinde). Ooops - aşağıdaki ile bir cevap var ..... stackoverflow.com/a/20404976/1213425
Erve1879

Celery 4.0+ için Django ile birlikte bu argümanın -Abulunduğu Django uygulamasıdır celery.py.
gitaarik

120

Kereviz 3.0+ için:

$ celery purge

Belirli bir kuyruğu temizlemek için:

$ celery -Q queue_name purge

9
Bağlantı hataları alırsanız, uygulamayı belirttiğinizden emin olun, örn celery -A proj purge.
Kamil Sindi

25

Kereviz 2.x ve 3.x için:

Örneğin kuyrukları tanımlamak için -Q parametresine sahip çalışan kullanırken

celery worker -Q queue1,queue2,queue3

o celery purgezaman işe yaramaz, çünkü kuyruk parametrelerini ona iletemezsiniz. Yalnızca varsayılan kuyruğu silecektir. Çözüm, işçilerinize --purgeböyle bir parametre ile başlamaktır :

celery worker -Q queue1,queue2,queue3 --purge

Ancak bu işçi çalıştıracaktır.

Diğer seçenek kereviz amqp alt komutunu kullanmaktır

celery amqp queue.delete queue1
celery amqp queue.delete queue2
celery amqp queue.delete queue3

Evet, bu kerevizlerin eski (2.x ve belki 3.x) versiyonları içindir. Cevabı düzenleyemiyorum
smido


9

Bunun celery purgedaha karmaşık kereviz yapılandırmam için işe yaramadığını gördüm. Farklı amaçlar için birden fazla adlandırılmış kuyruk kullanıyorum:

$ 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

İlk sütun kuyruk adı, ikincisi kuyrukta bekleyen mesaj sayısı, üçüncüsü de bu kuyruk için dinleyici sayısıdır. Sıralar:

  • kereviz - Standart, idempotent kereviz görevleri için kuyruk
  • apns - Apple Push Notification Service görevleri için sıra, tam olarak idempotent değil
  • analytics - Uzun süredir devam eden gece analizi için sıra
  • * .pidbox - Kapanma ve sıfırlama gibi çalışan komutları sırası, çalışan başına bir (2 kereviz çalışanı, bir apn çalışanı, bir analitik çalışanı)
  • bcast. * - Bir kuyruğu dinleyen tüm işçilere mesaj göndermek için yayın sıraları (sadece ilk yakalayanlardan ziyade)
  • celeryev. * - Görev analizlerini bildirmek için kereviz olay kuyrukları

Analitik görevi, küçük veri kümelerinde harika çalışan kaba kuvvet görevleridir, ancak şimdi işlenmesi 24 saatten fazla sürmektedir. Bazen, bir şeyler ters gidecek ve veritabanında beklemeye takılıp kalacaktır. Yeniden yazılması gerekiyor, ancak o zamana kadar, sıkışınca görevi öldürürüm, kuyruğu boşaltır ve tekrar denerim. 0 (bitmiş analitik) veya 1 (geçen gece analitiklerin bitmesini bekleyerek) olması gereken analitik kuyruğunun mesaj sayısına bakarak "sıkışmışlık" tespit ediyorum. 2 veya üstü kötü ve bir e-posta alıyorum.

celery purge yayın kuyruklarından birinden görevleri silmeyi teklif ediyor ve farklı bir adlandırılmış kuyruk seçme seçeneği görmüyorum.

İşte benim sürecim:

$ 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

Yine de bir cevap değil, değil mi? Ancak çok bilgilendirici!
amn

4
celeryctl purgeadlandırılmış kuyruklarla çalışmadı. python manage.py celery amqp queue.purge <queue_name>yaptı. Bağlamın karmaşık kurulumları olanlar için yararlı olduğunu düşünüyorum, böylece celeryctl purgebaşarısız olursa ne yapmaları gerektiğini anlayabilirler .
jwhitlock

manage.pyKereviz 3.1.17'de bulamıyorum , dosya kaldırıldı mı veya sadece yeni şaplak mı? Ancak , karşılık gelen arabirim ( queue.purge) neye benzediğini buldum */bin/amqp.py. Ancak dosyanın içeriğini belgelerle ilişkilendirmeye çalıştıktan sonra, Kereviz'in çaresizce belgelenmediğini ve aynı zamanda en azından kaynak koduyla değerlendirerek çok kıvrımlı bir çalışma olduğunu itiraf etmeliyim .
amn

manage.py, Django yönetim betiğidir ve manage.py celeryyapılandırmayı Django ayarlarından yükledikten sonra kerevizi çalıştırır. Django dışında kereviz kullanmadım, ancak dahil edilen celerykomut aradığınız şey olabilir: celery.readthedocs.org/en/latest/userguide/monitoring.html
jwhitlock 29:15

5

Kereviz 3+

http://docs.celeryproject.org/en/3.1/faq.html#how-do-i-purge-all-waiting-tasks

CLI

Adlandırılmış kuyruğu temizle:

 celery -A proj amqp queue.purge <queue name>

Yapılandırılmış kuyruğu temizle

celery -A proj purge

İletileri temizledim, ancak sırada hâlâ iletiler kaldı mı? Yanıt: Gerçekte yürütülür yürütülmez görevler onaylanır (kuyruktan kaldırılır). İşçinin bir görev aldıktan sonra, özellikle yürütülmesini bekleyen birçok görev varsa, gerçekten yürütülene kadar biraz zaman alacaktır. Onaylanmayan iletiler, aracıya (AMQP sunucusu) bağlantıyı kapatana kadar çalışan tarafından tutulur. Bu bağlantı kapatıldığında (örneğin, çalışan durdurulduğu için) görevler, aracı tarafından bir sonraki kullanılabilir çalışana (veya yeniden başlatıldığında aynı çalışana) yeniden gönderilir, böylece bekleme görevlerinin sırasını düzgün bir şekilde temizlemek için tüm işçileri durdurmalı ve sonra celery.control.purge () kullanarak görevleri temizlemelisiniz.

Bu yüzden tüm kuyruğu temizlemek için çalışanlar durdurulmalıdır.


5

Bekleyen tüm görevleri ve ayrıca Kereviz'i tamamen durdurmak için aktif ve ayrılmış olanları kaldırmak istiyorsanız, bu benim için işe yaradı:

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. Bekleme görevleri sırasını düzgün bir şekilde temizlemek için tüm çalışanları durdurmanız gerekir ( http://celery.readthedocs.io/en/latest/faq.html#i-ve-purged-messages-but-there-are- hala iletiler-kuyrukta kalmış ):

$ sudo rabbitmqctl stop

veya (RabbitMQ / Message Broker'ın Süpervizör tarafından yönetilmesi durumunda):

$ sudo supervisorctl stop all

2. ... ve sonra görevleri belirli bir kuyruktan temizleyin:

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

3. RabbitMQ'yu başlatın:

$ sudo rabbitmqctl start

veya (RabbitMQ'nun Yönetici tarafından yönetilmesi durumunda):

$ sudo supervisorctl start all

2

kereviz 4+ kereviz temizleme komutu yapılandırılmış tüm görev kuyruklarını temizlemek için

celery -A *APPNAME* purge

programlı:

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

beklemedeki tüm görevler temizlenir. Referans: celerydoc

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.