上記の記事では、各メッセージが 1 つの受信者にのみ送信され、すべての受信者が受信できるようにする必要がある場合は、スイッチを使用する必要があります。
スイッチの動作原理: メッセージ送信側は最初にメッセージをスイッチに送信し、次にスイッチはメッセージをバインドされたメッセージキューに送信します。その後、各受信側は独自のメッセージから情報を受信できます。列。
rabbitmqスイッチの動作原理
以下では、send.pyとreceive.pyを使用してスイッチの機能をシミュレートします。 send.py は送信側を表し、receive.py は受信側を表します。
receive.py コード分析
最初の記事の accept.py と比較すると、主な変更点が 2 つあります:
スイッチを定義する
hello キューは使用されなくなり、一時的なキューが使用されます。ランダムに生成されたキューをスイッチにバインドする
#!/usr/bin/env python #coding=utf8 import pika connection= pika.BlockingConnection(pika.ConnectionParameters( 'localhost')) channel= connection.channel() #定义交换机 channel.exchange_declare(exchange='messages',type='fanout') #随机生成队列,并绑定到交换机上 result= channel.queue_declare(exclusive=True) queue_name= result.method.queue channel.queue_bind(exchange='messages', queue=queue_name) def callback(ch, method, properties, body): print " [x] Received %r" % (body,) channel.basic_consume(callback, queue=queue_name, no_ack=True) print ' [*] Waiting for messages. To exit press CTRL+C' channel.start_consuming()
上記コード例では、queue_declareのパラメータexclusive=Trueは、受信側が終了する際に一時的に生成したキューを破棄し、リソースを占有しないことを意味しています。このプログラムを実行し、rabbitmqctl list_exchanges コマンドを使用してスイッチ情報を表示します。
rabbitmq switch information view
赤いボックスは、上の例で定義されたスイッチです。次に、rabbitmqctl list_queues を使用して、メッセージ キューの状況を確認します。
rabbitmq キュー情報の表示
赤いボックスは、ランダムに生成されたメッセージ キューです。
send.py コード分析
最初の記事の send.py と比較すると、次の 2 つの変更のみが行われています:
スイッチを定義する
メッセージを hello キューに送信する代わりに、交換局へ
#!/usr/bin/env python #coding=utf8 import pika connection= pika.BlockingConnection(pika.ConnectionParameters( 'localhost')) channel= connection.channel() #定义交换机 channel.exchange_declare(exchange='messages',type='fanout') #将消息发送到交换机 channel.basic_publish(exchange='messages', routing_key='', body='Hello World!') print " [x] Sent 'Hello World!'" connection.close()
上記サンプルコードでは、basic_publishメソッドのパラメータexchangeに対応する交換局を設定し、全キューにブロードキャスト送信するため、routing_keyの設定は必要ありません。
exchange が空の場合、匿名スイッチが使用されていることを意味します。上のスイッチ情報の図では、システムのデフォルトのスイッチである amq.* のようなスイッチがあることがわかります。 Routing_key は、匿名スイッチを使用する場合にのみ指定する必要があり、どのキューに送信されるかを示します。最初の記事の例では、この機能を示しています。
別のターミナルを開いてsend.pyを実行すると、receive.pyがメッセージを受信したことがわかります。複数の端末がreceive.pyを実行した場合、各receive.pyがメッセージを受信します。
上記は Python Rabbitmq の使い方 (3) の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。