简介
众所周知,RabbitMQ是一个开源的高性能的消息队列,支持多种开发语言:Java,Python,.Net,C,C++,PHP等多种语言,那么如何通过Python语言调用RabbitMQ呢?Python中pika这个模块提供了完整的调用方法,通过这个包我们可以实现Rabbit的简单模式,交换机模式以及一些特殊的参数。那么我们如何使用pika模块呢,接下来,请看听我慢慢道来。
一、简单模式
生产者
- 简单模式下,有多个消费者时,采用轮询方式处理消息。
import pika
if __name__ == '__main__':
# 创建凭证,使用rabbitmq用户密码登录
credentials = pika.PlainCredentials("lhx", "123456")
cpara = pika.ConnectionParameters(host='111.204.156.11', port=9015, credentials=credentials)
connection = pika.BlockingConnection(cpara)
# 创建频道
channel = connection.channel()
# 新建一个queue1队列,用于接收消息
channel.queue_declare(queue='queue1')
# 注意在rabbitmq中,消息想要发送给队列,必须经过交换(exchange),
# 初学可以使用空字符串交换(exchange=''),
# 它允许我们精确的指定发送给哪个队列(routing_key=''),
# 参数body值发送的数据
channel.basic_publish(exchange='',
routing_key='queue1',
body='哈哈哈。。。')
print("已经发送了消息")
# 程序退出前,确保刷新网络缓冲以及消息发送给rabbitmq,需要关闭本次连接
connection.close()
消费者
import pika
if __name__ == '__main__':
# 建立与rabbitmq的连接
credentials = pika.PlainCredentials("lhx", "123456")
cpara = pika.ConnectionParameters(host='111.204.156.11', port=9015, credentials=credentials)
connection = pika.BlockingConnection(cpara)
# 创建频道
channel = connection.channel()
# 生命队列,消费者也要生命队列,因为我们不能确定消费者与生产者谁先启动。
channel.queue_declare(queue="queue1")
# 回调函数,里面存放执行内容。
def callback(ch, method, properties, body):
print(type(body))
print(body.decode(encoding='utf-8'))
print("消费者接收到了任务:%r" % body)
# 有消息来临,callback,没有消息则夯住,等待消息
channel.basic_consume(on_message_callback=callback, queue='queue1', auto_ack=True)
# 开始消费,接收消息
channel.start_consuming()
- 公平分发 此模式下,如果有多个消费者,将轮询获取消息,不会考虑消费者的消费能力,那么如何让高性能的消费者接受更多的任务呢,此时,可设置公平分发机制:
消费者中加入以下代码
# 公平分发参数,根据消费者的性能进行分发
channel.basic_qos(prefetch_count=1)
- 取消自动应答:如果消费者消费失败,消息会丢失,此时可以设置取消自动应答,在回调函数结尾处加入如下代码:
ch.basic_ack(delivery_tag=method.delivery_tag)
手动应答,如果回调函数处理过程中发生错误,该条语句不会执行,消息回滚,等待下次消费。示例代码如下:
# consumer.py
import pika
if __na