首頁 >後端開發 >Python教學 >Python rabbitmq的使用(三)

Python rabbitmq的使用(三)

黄舟
黄舟原創
2017-01-17 14:54:491903瀏覽

上面一篇是說到了工作佇列,每次訊息都只會發送給其中一個接收端,如果需要將訊息廣播出去,讓每個接收端都能收到,那麼就要使用交換器。


交換機的工作原理:訊息發送端先將訊息傳送給交換機,交換機再將訊息傳送到綁定的訊息佇列,而後每個接收端都能從各自的訊息佇列接收訊息。

Python rabbitmq的使用(三)

rabbitmq交換器工作原理


下面用send.py和receive.py來模擬實現交換器的功能。 send.py表示發送端,receive.py表示接收端。


receive.py代碼分析


和第一篇裡的receive.py相比,主要是做了兩個改動:

定義機 
佇列,並綁定到交換器上 

#!/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指令來查看交換器資訊:

Python rabbitmq的使用(三)

rabbitmq交換器資訊查看


其中紅色框就是上例定義的交換器了。再使用rabbitmqctl list_queues查看下訊息佇列情況:

Python rabbitmq的使用(三)

rabbitmq佇列資訊查看


其中紅色框就是隨機產生的訊息佇列了。


send.py代碼分析


和第一篇的send.py相比,也只做了兩個改動:

定義交換機 不是將訊息發送到隊列到交換器 

#!/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的使用(三)的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn