web-dev-qa-db-ja.com

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

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

170
nabizan

docs から:

$ celery -A proj purge

または

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

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

255
Philip Southam

セロリ3.0以降の場合:

$ celery purge

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

$ celery -Q queue_name purge
114
ToonAlfrink

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
23
smido

Celery 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

10
ksindi

celery purgeは、より複雑なセロリの設定では機能しないことがわかりました。さまざまな目的で複数の名前付きキューを使用します。

$ Sudo rabbitmqctl list_queues -p celery name messages consumers
Listing queues ...  # Output sorted, whitespaced for readability
celery                                          0   2
[email protected]                      0   1
[email protected]                      0   1
apns                                            0   1
[email protected]                        0   1
analytics                                       1   1
[email protected]                   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つ、APNワーカー1つ、分析ワーカー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
9
jwhitlock

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

1.待機中のタスクのキューを適切にパージするには、すべてのワーカーを停止する必要があります( http://celery.readthedocs.io/en/latest/faq.html#i-ve-purged-messages-but-そこにまだキューが残っています ):

$ 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
Ukr

celery 4 +構成済みのすべてのタスクキューをパージするcelery purgeコマンド

celery -A *APPNAME* purge

プログラムで:

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

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

2
Roshan Bagdiya