Python通過RabbitMQ服務(wù)器實(shí)現(xiàn)交換機(jī)功能的實(shí)例教程
作者:陳杰斌
快速回顧一下RabbitMQ服務(wù)器的安裝:
sudo apt-get install rabbitmq-server
Python使用RabbitMQ需要Pika庫:
sudo pip install pika
好了,接下來我們先看交換機(jī)的工作原理:消息發(fā)送端先將消息發(fā)送給交換機(jī),交換機(jī)再將消息發(fā)送到綁定的消息隊(duì)列,而后每個(gè)接收端都能從各自的消息隊(duì)列里接收到信息。
下面用send.py和receive.py來模擬實(shí)現(xiàn)交換機(jī)的功能。send.py表示發(fā)送端,receive.py表示接收端。
receive.py:
#!/usr/bin/env python #coding=utf8 import pika connection = pika.BlockingConnection(pika.ConnectionParameters( 'localhost')) channel = connection.channel() #定義交換機(jī) channel.exchange_declare(exchange='messages', type='fanout') #隨機(jī)生成隊(duì)列,并綁定到交換機(jī)上 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的參數(shù)exclusive=True表示當(dāng)接收端退出時(shí),銷毀臨時(shí)產(chǎn)生的隊(duì)列,這樣就不會(huì)占用資源。運(yùn)行這個(gè)程序,然后使用rabbitmqctl list_exchanges命令來查看交換機(jī)信息:
其中紅色框就是上例定義的交換機(jī)了。再使用rabbitmqctl list_queues查看下消息隊(duì)列情況:
其中紅色框就是隨機(jī)產(chǎn)生的消息隊(duì)列了。
send.py:
#!/usr/bin/env python #coding=utf8 import pika connection = pika.BlockingConnection(pika.ConnectionParameters( 'localhost')) channel = connection.channel() #定義交換機(jī) channel.exchange_declare(exchange='messages', type='fanout') #將消息發(fā)送到交換機(jī) channel.basic_publish(exchange='messages', routing_key='', body='Hello World!') print " [x] Sent 'Hello World!'" connection.close()
上例代碼中, basic_publish方法的參數(shù)exchange被設(shè)定為相應(yīng)交換機(jī),因?yàn)槭且獜V播出去,發(fā)送到所有隊(duì)列,所以routing_key就不需要設(shè)定了。
exchange如果為空,表示是使用匿名的交換機(jī),在上面交換機(jī)信息的圖片中可以看到有amq.*這樣的交換機(jī),就是系統(tǒng)默認(rèn)的交換機(jī)了。routing_key在使用匿名交換機(jī)的時(shí)候才需要指定,表示發(fā)送到哪個(gè)隊(duì)列的意思。第一篇的例子演示了這個(gè)功能。
打開另外一個(gè)終端,執(zhí)行send.py,可以觀察到receive.py接收到了消息。如果有多個(gè)終端執(zhí)行receive.py,那么每個(gè)receive.py都會(huì)接收到消息。