225

各タスクを知らなくても、保留中のすべてのタスクを削除するにはどうすればよいtask_idですか?

4

10 に答える 10

363

ドキュメントから:

$ celery -A proj purge

また

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

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

于 2011-08-23T01:20:23.907 に答える
143

セロリ3.0以降の場合:

$ celery purge

特定のキューをパージするには:

$ celery -Q queue_name purge
于 2013-12-05T16:11:39.190 に答える
33

Celery 2.xおよび3.xの場合:

たとえば、-Qパラメーターを指定してworkerを使用してキューを定義する場合

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
于 2015-11-04T20:43:59.310 に答える
18

セロリ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

于 2016-04-03T17:28:35.880 に答える
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プッシュ通知サービスタスクのキュー、べき等ではない
  • 分析-長時間実行される夜間分析のキュー
  • * .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
于 2014-10-03T20:00:19.117 に答える
8

セロリ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()を使用してタスクをパージする必要があります。

したがって、キュー全体をパージするには、ワーカーを停止する必要があります。

于 2017-01-20T00:12:30.180 に答える
8

保留中のすべてのタスクと、アクティブなタスクと予約済みのタスクを削除して、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)
于 2019-09-08T16:00:44.283 に答える
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
于 2017-03-27T15:23:04.887 に答える
2

設定されたすべてのタスクキューをパージするcelery4+ celerypurgeコマンド

celery -A *APPNAME* purge

プログラムで:

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

保留中のすべてのタスクが削除されます。参照:celerydoc

于 2019-04-29T07:17:15.037 に答える
2

ブローカーとしてRabbitMQを使用するCeleryバージョン5.0以降の場合

最初にプログラムからブローカーへの新しい接続を確立し、接続をキューにバインドしてパージする必要があります。

# proj/celery.py
from celery import Celery
app = Celery('proj')
from proj.celery import app
queues = ['queue_A', 'queue_B', 'queue_C']
with app.connection_for_write() as conn:
    conn.connect()
    for queue in queues:
        count = app.amqp.queues[queue].bind(conn).purge()
        print(f'Purge {queue} with {count} message(s)')
于 2021-06-30T07:45:05.963 に答える