ブローカーとしてRedisでCelery(3.0.15)を使用しています。
Celeryキューに存在する特定の名前のタスクの数をクエリする簡単な方法はありますか?
そして、フォローアップとして、Celeryキューに存在する特定の名前のすべてのタスクをキャンセルする方法はありますか?
監視および管理ガイド を確認しましたが、そこに解決策がありません。
# Retrieve tasks
# Reference: http://docs.celeryproject.org/en/latest/reference/celery.events.state.html
query = celery.events.state.tasks_by_type(your_task_name)
# Kill tasks
# Reference: http://docs.celeryproject.org/en/latest/userguide/workers.html#revoking-tasks
for uuid, task in query:
celery.control.revoke(uuid, terminate=True)
以前の回答では対処されていない問題が1つあり、知らない場合は人々を混乱させる可能性があります。
既に投稿されているこれらのソリューションの中で、 Danielle's を1つのマイナー変更を加えて使用します。タスクをファイルにインポートし、その_.name
_属性を使用して、タスク名を取得して.tasks_by_type()
。
_app.control.revoke(
[uuid for uuid, _ in
celery.events.state.State().tasks_by_type(task.name)])
_
ただし、このソリューションでは、将来の実行がスケジュールされているタスクは無視されます。他の回答にコメントした一部の人のように、.tasks_by_type()
return空のリストがありました。そして実際、私の待ち行列は空でした。しかし、将来実行される予定のタスクがあり、これらのタスクが私の主なターゲットであることは知っていました。 _celery -A [app] inspect scheduled
_を実行してそれらを確認できましたが、上記のコードの影響を受けませんでした。
これを行うことで、スケジュールされたタスクをなんとか取り消すことができました。
_app.control.revoke(
[scheduled["request"]["id"] for scheduled in
chain.from_iterable(app.control.inspect().scheduled()
.itervalues())])
_
app.control.inspect().scheduled()
は、キーがワーカー名で、値がスケジュール情報のlistsである辞書を返します(したがって、itertools
からインポートされる_chain.from_iterable
_が必要です) 。タスク情報は、スケジュール情報の_"request"
_フィールドにあり、_"id"
_にはタスクIDが含まれています。失効後も、スケジュールされたタスクはスケジュールされたタスクの中に表示されたままであることに注意してください。取り消されたスケジュール済みタスクは、タイマーが期限切れになるか、Celeryがクリーンアップ操作を実行するまで、スケジュール済みタスクのリストから削除されません。 (ワーカーを再起動すると、このようなクリーンアップがトリガーされます。)
これは1つの要求で行うことができます。
app.control.revoke([
uuid
for uuid, _ in
celery.events.state.State().tasks_by_type(task_name)
])
flower
が監視を提供するようです:
https://github.com/mher/flower
Celery Eventsを使用したリアルタイム監視
タスクの進捗状況と履歴タスクの詳細を表示する機能(引数、開始時間、実行時間など)グラフと統計リモートコントロール
ワーカーステータスと統計の表示ワーカーインスタンスのシャットダウンと再起動ワーカープールのサイズと自動スケール設定の制御ワーカーインスタンスが消費するキューの表示と変更現在実行中のタスクの表示スケジュールされたタスクの表示(ETA /カウントダウン)予約済みタスクと取り消し済みタスクの表示時間とレート制限の適用構成ビューアタスクの取り消しまたは終了HTTP API
OpenID認証