接著上一章。這一章,我們要將同一個消息發(fā)給多個客戶端。這就是發(fā)布訂閱模式。直接看代碼:
發(fā)送端:
import pika
import sys
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
# 原則上,消息,只能有交換機傳到隊列。就像我們家里面的交換機道理一樣。
# 有多個設(shè)備連接到交換機,那么,這個交換機把消息發(fā)給那個設(shè)備呢,就是根據(jù)
# 交換機的類型來定。類型有:direct\topic\headers\fanout
# fanout:這個就是,所有的設(shè)備都能收到消息,就是廣播。
# 此處定義一個名稱為'logs'的'fanout'類型的exchange
channel.exchange_declare(exchange='logs',
exchange_type='fanout')
# 將消息發(fā)送到名為log的exchange中
# 因為是fanout類型的exchange,所以無需指定routing_key
message = ' '.join(sys.argv[1:]) or "info: Hello World!"
channel.basic_publish(exchange='logs',
routing_key='',
body=message)
print(" [x] Sent %r" % message)
connection.close()
接收端:
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
# 這里需要和發(fā)送端保持一致(習慣和要求)
channel.exchange_declare(exchange='logs',
exchange_type='fanout')
# 類似的,比如log,我們其實最想看的,當連接上的時刻到消費者退出,這段時間的日志
# 有些消息,過期了的對我們并沒有什么用
# 并且,一個終端,我們要收到隊列的所有消息,比如:這個隊列收到兩個消息,一個終端收到一個。
# 我們現(xiàn)在要做的是:兩個終端都要收到兩個
# 那么,我們就只需做個臨時隊列。消費端斷開后就自動刪除
result = channel.queue_declare(exclusive=True)
# 取得隊列名稱
queue_name = result.method.queue
# 將隊列和交換機綁定一起
channel.queue_bind(exchange='logs',
queue=queue_name)
print(' [*] Waiting for logs. To exit press CTRL+C')
def callback(ch, method, properties, body):
print(" [x] %r" % body)
# no_ack=True:此刻沒必要回應(yīng)了
channel.basic_consume(callback,
queue=queue_name,
no_ack=True)
channel.start_consuming()
效果: