Python rabbitmq的使用(三)

上面一篇是說到了工做隊列,每次消息都只會發送給其中一個接收端,若是須要將消息廣播出去,讓每一個接收端都能收到,那麼就要使用交換機。python

交換機的工做原理:消息發送端先將消息發送給交換機,交換機再將消息發送到綁定的消息隊列,然後每一個接收端都能從各自的消息隊列裏接收到信息。app

rabbitmq交換機工做原理

rabbitmq交換機工做原理spa

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

receive.py代碼分析cdn

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

  • 定義交換機
  • 不使用hello隊列了,隨機生成一個臨時隊列,並綁定到交換機上

1rabbitmq

2隊列

3圖片

4ci

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

#!/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交換機信息查看

rabbitmq交換機信息查看

其中紅色框就是上例定義的交換機了。再使用rabbitmqctl list_queues查看下消息隊列狀況:

rabbitmq隊列信息查看

rabbitmq隊列信息查看

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

send.py代碼分析

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

  • 定義交換機
  • 不是將消息發送到hello隊列,而是發送到交換機

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#!/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都會接收到消息。

相關文章
相關標籤/搜索