セロリ/ rabbitmqのすべての保留中のタスクを削除する


回答:


296

ドキュメントから:

$ celery -A proj purge

または

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

(編集:現在の方法で更新されました。)


56
または、ジャンゴから、セロリ3.0以降:manage.py celery purgeceleryctl廃止され、3.1で消えてしまいます)。
Henrik Heimbuerger 2013

3
Redisバックエンドでこれを行う方法を探しているこの答えを見つけました。私が見つけた最良の方法は私のredis-cli KEYS "celery*" | xargs redis-cli DELために働いたものでした。これにより、使用しているredisバックエンドに保存されているすべてのタスクが消去されます。
Melignus 2013

1
セロリ3.0でこれを行うにはどうすればよいですか?
luistm 2013年

2
私にとっては、celery purge(関連する仮想環境内の)単純なものでした。
おっと

Celery 4.0+とDjangoの組み合わせの場合も、このコマンドです。引数はが配置され-AているDjangoアプリcelery.pyです。
gitaarik 2017年

120

セロリ3.0以降の場合:

$ celery purge

特定のキューを削除するには:

$ celery -Q queue_name purge

9
接続エラーが発生した場合は、アプリなどを指定してくださいcelery -A proj purge
カミルシンディ

25

Celery 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 '11 / 07/17


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

最初の列はキュー名、2番目の列はキューで待機しているメッセージの数、3番目の列はそのキューのリスナーの数です。キューは次のとおりです。

  • セロリ-標準のべき等のセロリタスクのキュー
  • apns-Apple Push Notification Serviceタスクのキュー、べき等ではありません
  • 分析-長時間実行される夜間分析のキュー
  • * .pidbox-シャットダウンやリセットなどのワーカーコマンドのキュー。ワーカーごとに1つ(2つのセロリワーカー、1つのapnsワーカー、1つの分析ワーカー)
  • bcast。*-ブロードキャストキュー、キューをリッスンするすべてのワーカーにメッセージを送信するため(最初に取得するのではなく)
  • celeryev。*-レポートタスク分析用のCeleryイベントキュー

分析タスクはブルートフォースタスクであり、小規模なデータセットでうまく機能しましたが、処理に24時間以上かかります。時々、何かがうまくいかず、それがデータベースで待機してスタックするでしょう。それを書き直す必要がありますが、それまでスタックしてしまうと、タスクを強制終了し、キューを空にして、再試行します。「スタック」を検出するには、分析キューのメッセージ数を調べます。0(終了した分析)または1(昨夜の分析が終了するのを待っている)である必要があります。2以上が悪いのでメールが届きます。

celery purge ブロードキャストキューの1つからタスクを消去することを提案していますが、別の名前付きキューを選択するオプションが表示されません。

これが私のプロセスです:

$ 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

答えはないけどね?しかし、非常に有益です!
2015年

4
celeryctl purge名前付きキューでは機能しませんでした。 python manage.py celery amqp queue.purge <queue_name>した。コンテキストは、セットアップが複雑な場合に役立つので、celeryctl purge失敗した場合に何をする必要があるかを理解できます。
jwhitlock、2015年

manage.pyCelery 3.1.17で見つけることができません。ファイルが削除されているのですか、それとも単に新しいファイルをスパンキングしているのですか?しかし、対応するインターフェイス(queue.purge)のように見えるものが見つかりました*/bin/amqp.py。しかし、ファイルの内容をドキュメントと関連付けようとした後、残念ながら、Celeryはドキュメント化されておらず、少なくともソースコードで判断すると非常に複雑な作業であることを認めざるを得ません。
2015年

manage.pyDjango管理スクリプトであり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- 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

2

設定済みのすべてのタスクキューを削除するcelery 4+ celery purgeコマンド

celery -A *APPNAME* purge

プログラム的に:

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

保留中のタスクはすべて削除されます。リファレンス:celerydoc

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.