官方原文档:https://www.rabbitmq.com/getstarted.html
官方提供的tutorial各语言代码:https://github.com/rabbitmq/rabbitmq-tutorials
- p:生产者
- hello: 名为hello的消息队列,可以多次建立,但是只会存在一个真正的队列。传递消息需要指定队列,否则rabbitmq会将消息丢掉
- c: 消费者
一个栗子:(栗子都可以在官方提供的repo中找到~)
send.py
#!/usr/bin/env python
import pika
#建立到Rabbitmq服务器的连接
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
#创建一个名为'hello'的队列用来将消息投递进去;如果消息发送给不存在的队列,rabbitmq会将消息丢掉的
channel.queue_declare(queue='hello')
'''
第一条信息包含"Hello World!"字符串,送到hello队列。
rabbitmq中消息不能直接发送到队列中,需要通过交换机(exchange)进行,空字符串''表示默认的交换机
默认交换机允许指定消息投递到那个具体的队列中,名字需要在routing_key参数中指定
'''
channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
print(" [x] Sent 'Hello World!'")
#退出之前,需确认网络缓存已经被刷写、消息投递到rabbitmq,通过安全关闭连接完成这一点
connection.close()
receive.py
#!/usr/bin/env python
import pika
#连接到rabbitmq服务器,和send.py代码是相同的
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
'''
确认队列存在,可以多次使用queue_declare建立同一个队列,但是只有一个队列真正被创建
重复申明的原因:不确定那个程序先执行,所以重复申明值得推荐
查看rabbitmq队列 && 队列中消息:rabbitmqctl list_queues(unix中添加sudo)
'''
channel.queue_declare(queue='hello')
'''
1.为队列定义一个回调函数(callback):
获取到信息的时候,pika库调用这个回调函数,这个回调函数讲接收到信息内容输出到屏幕上
2.有关回调函数的我的理解就是执行回调函数作为函数b的一个参数,然后调用函数b的时候,可以间接调用这个回调函数(也可以把lambda传入函数b起类似地作用)
3.有关回调函数可以参考:
回调函数(callback)是什么? - no.body的回答 - 知乎
https://www.zhihu.com/question/19801131/answer/27459821
'''
def callback(ch, method, properties, body):
print(" [x] Received %r" % body)
'''
rabbit这个回调函数将从名为"hello"队列中接收信息。
这步操作需要确认hello队列存在(我们这里可以确保存在,因为开头已经声明了
no_ack稍后介绍
'''
channel.basic_consume(
queue='hello', on_message_callback=callback, auto_ack=True)
#运行一个用于等待消息数据且在需要的时候运行回调函数的无限循环-->start_consuming()
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
运行结果:
1.启动消费者
python receive.py
[*] Waiting for messages. To exit press CTRL+C
[x] Received 'Hello World!' -->这句话是send.py执行后显示的
2.启动生产者
python send.py
[x] Sent 'Hello World!'