問題タブ [python-pika]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
320 参照

python-3.x - pika と RabbitMQ でメッセージを再発行する方法

RabbitMQ メッセージをリッスンし、各メッセージを少しだけ処理して、別の取引所に送信する必要があります。これまでに見た各例には、次のいずれかが含まれています。

またはこれ:

メッセージの受信と送信の両方が必要なので、おそらく両方のループを同時に実行する必要があります。それを達成する方法はありますか?

0 投票する
2 に答える
7980 参照

python - RabbitMQ は、実行時間の長いタスクの処理時に接続を閉じ、タイムアウト設定でエラーが発生する

RabbitMQ プロデューサーを使用して、実行時間の長いタスク (30 分以上) をコンシューマーに送信しています。問題は、サーバーへの接続が閉じられ、未確認のタスクが再度キューに入れられたときに、コンシューマーがまだタスクを処理していることです。

調査の結果、ハートビートまたは接続タイムアウトの増加を 使用してこれを解決できることがわかりました。これらのソリューションはどちらも、試行時にエラーを発生させます。同様の投稿への回答を読んで、回答が投稿されてから多くの変更がRabbitMQに実装されたことも知りました(たとえば、RabbitMQ 3.5.5より前のデフォルトのハートビートタイムアウトは580から60に変更されました)。

ハートビートおよびブロックされた接続のタイムアウトを指定する場合:

次のエラーが表示されます。

接続パラメーターで指定するheartbeat_interval=1000と、同様のエラーが表示されます。TypeError: __init__() got an unexpected keyword argument 'heartbeat_interval'

同様にsocket_timeout = 1000、次のエラーが表示されます。TypeError: __init__() got an unexpected keyword argument 'socket_timeout'

Ubuntu 14.04 で RabbitMQ 3.6.1、ピカ 0.10.0、および python 2.7 を実行しています。

  1. 上記のアプローチでエラーが発生するのはなぜですか?
  2. 長時間実行される継続的なタスクがある場合、ハートビート アプローチを使用できますか? たとえば、30 分以上かかる大規模なデータベース結合を実行するときにハートビートを使用できますか? データベース結合などのタスクにかかる時間を判断するのは難しい場合が多いため、私はハートビート アプローチを支持します。

同様の質問への回答を読みました

更新:ピカのドキュメントからコードを実行すると、同じエラーが発生します。

0 投票する
1 に答える
1062 参照

rabbitmq - kombu が RabbitMQ に再接続しない

私は 2 つのサーバーを持っており、それらを A と B と呼びます。B は RabbitMQ を実行し、A は Kombu 経由で RabbitMQ に接続します。B で RabbitMQ を再起動すると、kombu 接続が切断され、メッセージが配信されなくなります。次に、A のプロセスをリセットして、接続を再確立する必要があります。より良いアプローチはありますか?つまり、RabbitMQ プロセスが再起動された場合でも、Kombu が自動的に再接続する方法はありますか?

私の基本的なコードの実装は以下のとおりです。よろしくお願いします。:)

0 投票する
1 に答える
209 参照

python-2.7 - global キーワードを使用しているにもかかわらず、このグローバル変数が Python 2.7 で更新されないのはなぜですか?

各メッセージが受信されるたびに AMQP メッセージの本文を返すコールバック関数があります。本文の内容をグローバル変数に割り当てて、プログラムでさらに操作できるようにしたいと考えています。

スクリプトの先頭にグローバル変数を作成し、コールバック関数内で global キーワードを使用しました。これにより、スクリプトの先頭にあるグローバル変数を更新できるはずですが、「グローバル変数」を別のスクリプトでは、コールバック関数内から body の現在の値ではなく、「test」の元の値が返されます...

Consumer.py

Importer.py

T_MSG の値がコールバック関数内から更新されない理由を理解できません。なぜなら、print ステートメントが body の正しい値を出力していることがはっきりとわかるからです。コールバック関数内でこれをグローバルとして宣言したにもかかわらず、 T_MSG の値をインポートして印刷しようとすると、期待している本文の内容ではなく、最初に割り当てられた 'Test' の値が取得されます...

コールバック関数がメッセージを受信して​​それを「処理」するたびに、body の新しい値を T_MSG (グローバル) 変数に割り当てる必要があるため、それを importer.py スクリプトにインポートできるはずだという印象を受けています。 -しかし、これは機能していません。私が読んだことはすべて、関数内でグローバルキーワードを使用してこれを実現することを示しているだけです...

どんな助けでも大歓迎です!

0 投票する
0 に答える
301 参照

rabbitmq - ピカで循環キューを宣言する方法

pika( python-pika)内のキューを循環キューとして宣言することは可能ですか? はいの場合、どのように?

つまり、循環キュー (またはリング) は、メッセージが選択されたときにキューから削除されるのではなく、キューの最後に再挿入されるキューです。たとえば、キュ​​ーにmsg_3, msg_2,が含まれている場合msg_1、コンシューマー get の後msg_1、後者が最後に挿入されるため、キューはmsg_1, msg_3, msg_2( ではなくmsg_3)msg_2になります。

編集: IMSoPで提案されているように、コンシューマーがすべての消費されたメッセージを再発行するようにすることができます (たとえば、コールバック関数の最後で)。