2016-11-29 1 views
5

rabbitmqctlが正しくキューに入れられたタスクの数千人を報告します。celery.control.inspectは、待ち行列に入れられたタスクがrabbitmqctlより少ないと報告するのはなぜですか?

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

しかし、セロリレポート:

>>> len(app.control.inspect().active()['[email protected]']) 
4 
>>> len(app.control.inspect().scheduled()['[email protected]']) 
1 
>>> len(app.control.inspect().reserved()['[email protected]']) 
16 
>>> len(app.control.inspect().revoked()['[email protected]']) 
0 

タスクの正しい数(数千)app.control.inspect().stats()['[email protected]']['total']に表示するように見えるが、私は本当に知りたいです未処理ののタスクがPython内からキューに入れられ、active()などは16までしか報告されていないようです - おそらく制限がありますか?私は(ところで、このサーバーが現在セロリ3.1.8を使用している)celery経由好ましくは、Pythonの内からフルキューイングされたタスクの数を取得する方法、rabbitmqctlに特権サブプロセスの呼び出しを使用しての

ショート

答えて

5

セロリのapp.control.inspectタスクを検査します実行中の作業者によってのみが処理されます。

キューに何千ものタスクがあるにも関わらず、ワーカーは特定の時点で特定のタスクをわずかしか実行しません。これらはactiveタスクです。

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

タスクにETAを設定している場合、または定期的なタスクがある場合は、scheduledタスクになります。

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

AFAIKでは、セロリを使用してキュー内のタスクの合計数を取得する方法はありません。

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

更新:

pikaがRabbitMQのと対話するPythonクライアントです。これを使用してメッセージを消費することができます。各メッセージはsimple example to consumeです。 pika docsでusage examplesをチェックアウトすることができます。

+0

ありがとうございました!キューの各メッセージが 'pika'などを使っているか、またはキュー内のメッセージの総数だけを知ることができますか?ありがとう@ChillarAnand; – DrMeers

+0

; 'pika'を介してメッセージを「消費する」ことは、セロリが処理するためにキューに安全に置かれますか?もしそうなら、これは良い解決策です。 – DrMeers

+1

@DrMeers私はそこに道があるとは思わない。しかし、あなたはメッセージを消費して再クエリーすることができますhttp://rabbitmq.1065348.n5.nabble.com/How-to-get-the-list-of-messages-from-Queue-without-consuming-the-messages-td28135.html – ChillarAnand

関連する問題