9

rabbitmqctlキューに入れられた数千のタスクを正しく報告します。

$ sudo rabbitmqctl -q list_queues name messages messages_ready messages_unacknowledged
default 13142   13126   16

しかし、セロリは次のように報告しています。

>>> len(app.control.inspect().active()['celery@default'])
4
>>> len(app.control.inspect().scheduled()['celery@default'])
1
>>> len(app.control.inspect().reserved()['celery@default'])
16
>>> len(app.control.inspect().revoked()['celery@default'])
0

正しい数 (数千) のタスクが に表示されているようですが、Python 内からキューに入れられた未app.control.inspect().stats()['celery@default']['total']処理のタスクの正しい数を知りたいと思っています。限界?active()

への特権サブプロセス呼び出しを使用するrabbitmqctl以外に、できれば Python 内から完全なキューに入れられたタスク数を取得するにはどうすればよいですかcelery(ところで、このサーバーは現在 Celery 3.1.8 を使用しています)

4

1 に答える 1

10

Celeryのapp.control.inspectは、実行中の workerによってのみ処理されるタスクを検査します。

キューに何千ものタスクがある場合でも、ワーカーは特定の時点で指定された少数のタスクしか実行しません。これらはactiveタスクです。

それに加えて、ワーカーは、そのワーカー用に予約されるいくつかのタスクをプリフェッチできます。これらはreservedタスクに表示されます。

タスクに ETA を設定した場合、または定期的なタスクがある場合、それらはscheduledタスクの下に表示されます。

同時実行数が 4 のワーカー (または 4 コア マシンのデフォルト設定のワーカー) を開始したようです。したがって、アクティブなタスクは 4 です。各ワーカー プロセスは 4 つのタスクをプリフェッチしたため、16 の予約済みタスクが発生しました。

私の知る限り、セロリでキュー内のタスクの総数を取得する方法はありません。

ただし、キュー内のメッセージの総数を取得するための Python ソリューションがいくつかあります。これを行う他の方法については、ここで私の他の回答を確認できます。

アップデート:

pikarabbitmq とやり取りするための Python クライアントです。これを使用してメッセージを消費できます。各メッセージを消費する簡単な例を次に示します。pika docs でより多くの使用例をチェックアウトできます。

于 2017-02-06T05:09:52.670 に答える