fanout:广播:所有bind到此exchange的queue都可以接受到消息
生产者:
# coding:utf8# __author: Administrator# date: 2018/3/15 0015# /usr/bin/env python#exchange订阅模式,是一个消息,大家都接收,原来是一人一个import pikaimport sysconnection = pika.BlockingConnection(pika.ConnectionParameters( host='localhost'))channel = connection.channel()#工作模式是在创建exchange时,设定的#之前是创建队列,将数据放入队列中queue_declare('')#但是当exchange开始工作的时候,不创建队列,开始创建一个交换机,为其命名,设置工作模式channel.exchange_declare(exchange='logs', type='fanout')#创建交换机后数据不再走队列了,开始走交换机message = "Info:Hello world"channel.basic_publish(exchange='logs', routing_key='',#空,没有作用,原来是记录队列名字,决定数据放到哪个队列下 body=message)print("Sent message")connection.close()
消费者:
# coding:utf8# __author: Administrator# date: 2018/3/15 0015# /usr/bin/env pythonimport pikaconnection = pika.BlockingConnection(pika.ConnectionParameters( host='localhost'))channel = connection.channel()#和生产者相比,两者只会创建一个channel.exchange_declare(exchange='logs', type='fanout')#虽然生产者数据产生在交换机中,但是消费者取数据依然要到队列中去获取,#每一个消费者都会重新产生一个队列#队列创建中参数exclusive将产生一个独有的队列名,通过method.queue获取队列名result = channel.queue_declare(exclusive=True)queue_name = result.method.queue#将队列绑定当交换机中,从中获取数据来channel.queue_bind(exchange='logs', queue=queue_name)print('waiting for logs')def callback(ch,method,properties,body): print("recv %s"%body)channel.basic_consume(callback, queue=queue_name, no_ack=True)channel.start_consuming()