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

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

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

RabbitMQ消息通信,一个生产者和多个消费者_第1张图片

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

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/

你可能感兴趣的:(python,RabbitMQ)