您的位置:首页 > 编程语言 > Python开发

RabbitMQ消息通信,一个生产者和多个消费者

2017-11-05 17:06 369 查看
上一则文章讲解了RabbitMQ的安装和简单一对一消息通信实现方法,具体可参考上一篇文章:http://blog.csdn.net/u012631731/article/details/72887588

这则文章讲述一个生产者和多个消费者的消息通信。



直接上源码,在源码里面进行注释讲述吧

client.py

#!/usr/bin/env python
import pika
import sys
#建立一个连接,目标地址为本机(localhost)
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
#创建一个消息通道
channel = connection.channel()
#创建一个消息队列,消息队列的名称为task_queue,
#这里的第二个参数durable,是对消息队列的设置,
#使得RabbitMQ在发生异常退出时发送的消息不会被丢失,该消息会被发送给其他消费者
channel.queue_declare(queue='task_queue', durable=True)
message = ' '.join(sys.argv[1:]) or "Hello World!"
#设置转换方式(默认),关联消息队列(routing_key),绑定消息体(body)
#delivery_mode 是设置消息队列的消息持久化,=1是不持久化,=2是持久化
channel.basic_publish(exchange='',
routing_key='task_queue',
body=message,
properties=pika.BasicProperties(
delivery_mode = 2, # make message persistent
))
print(" [x] Sent %r" % message)
#发送完毕后关闭连接
connection.close()


server.py

#!/usr/bin/env python
import pika
import time
#不解释
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
#不解释
channel = connection.channel()
#不解释
channel.queue_declare(queue='task_queue', durable=True)
print(' [*] Waiting for messages. To exit press CTRL+C')
#在取消息的这个回调函数里面加了一个sleep,这样可以模拟不同消费者之间切换任务
#并且配置了消息接受后的消息确认,在一对一通信时我们设置no_ack为true
def callback(ch, method, properties, body):
print(" [x] Received %r" % body)
time.sleep(body.count(b'.'))
print(" [x] Done")
ch.basic_ack(delivery_tag = method.delivery_tag)
#设置每一个消费者最大的消息处理数量,这里设置为两个
channel.basic_qos(prefetch_count=2)
channel.basic_consume(callback,
queue='task_queue')
channel.start_consuming()
最后使用python执行它们,执行多个python server.py 和一个python client.py

更多请查询RabbitMQ官网:http://www.rabbitmq.com/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息