【分布式爬虫】使用 RabbitMQ 发送和接收消息

本文介绍了如何使用Python的pika库在RabbitMQ中实现生产者发送消息到名为hello的队列,以及消费者从该队列接收消息的过程,包括队列声明和连接管理。
摘要由CSDN通过智能技术生成

RabbitMQ 是一个开源的消息队列系统,它允许应用程序和分布式系统通过可靠的消息传递进行通信

生产者(发送消息到 RabbitMQ 队列):

创建一个到本地 RabbitMQ 服务器的连接,声明了一个名为 'hello' 的队列,并发送了一条消息 "Hello World!" 到这个队列。

import pika  
  
# 建立到 RabbitMQ 服务器的连接  
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))  
channel = connection.channel()  
  
# 声明一个队列以便发送消息,如果队列不存在则创建。这里的队列名是 'hello'。
# 可以通过在 queue_declare 方法中设置 durable=True 来实现队列持久化。这样在 RabbitMQ 服务器重启后,队列和其中的消息不会丢失。
channel.queue_declare(queue='hello')  
  
# 发布一条消息到名为 'hello' 的队列中。  
channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')  
  
# 关闭连接  
connection.close()

消费者(从 RabbitMQ 队列接收消息):

创建一个到本地 RabbitMQ 服务器的连接,声明同一个名为 'hello' 的队列,并定义了一个回调函数来接收并打印从队列中获取的消息。

import pika  
  
# 建立到 RabbitMQ 服务器的连接  
# 可以使用 pika.SelectConnection 代替 pika.BlockingConnection 以支持异步操作,或者使用连接池来复用连接
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))  
channel = connection.channel()  
  
# 声明一个队列以便从中接收消息。  
channel.queue_declare(queue='hello')  
  
# 定义一个回调函数来处理接收到的消息  
'''
--ch: 当前通道(Channel)对象的引用,通过它你可以执行更多的操作,比如发送确认消息或拒绝消息。
--method: 一个 pika.spec.Basic.Deliver 对象,包含了消息的投递详情,比如交换机名称、路由键和消息的唯一标识符等。
--properties: 一个 pika.BasicProperties 对象,包含了消息的属性,比如内容类型、编码、头信息、过期时间等。
--body: 接收到的消息内容,通常是一个字节串(bytes)。你可以通过将其解码为字符串来查看消息内容,比如 body.decode('utf-8')。 
'''
def callback(ch, method, properties, body):  
    print(f"Received {body}")  
  
# 告诉 RabbitMQ 使用上面定义的回调函数来接收来自 'hello' 队列的消息。 
# callback的参数都是由 RabbitMQ 自动提供的,不需要手动传递它们。
# 当消息到达队列并且 basic_consume 方法已经注册了回调函数时,RabbitMQ 会负责调用回调函数,并传递相应的参数。
channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)  
  
# 开始接收消息,并进入永久循环,等待消息并在需要时运行回调函数。  
print('Waiting for messages. To exit press CTRL+C')  
channel.start_consuming()

queue_declare 方法用于声明一个队列。上面示例代码中,当生产者和消费者代码中都使用 channel.queue_declare(queue='hello') 时,它们指的是同一个队列,前提是它们连接到的是同一个 RabbitMQ 服务器,并且队列名称( 'hello')完全相同。

如果队列已经存在,并且其属性与声明中的相同,则此声明不会有任何影响;如果队列不存在,则会创建一个新队列。因此,当生产者和消费者都声明相同的队列时,它们实际上是在确保这个队列存在,以便生产者可以发送消息到这个队列,消费者可以从这个队列接收消息。

这种重复声明通常不是问题确保了无论哪个程序先运行,队列都会被正确地创建。但是,如果在声明队列时指定了不同的属性(比如是否持久化、是否排他等),则可能会出现问题,因为 RabbitMQ 不会允许用不同的属性重新声明一个已经存在的队列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值