# 知识复盘
在爬取数据的时候,可能需要一些进程之间的通信机制,例如:A:负责构建爬取请求,B:负责执行爬取请求,C:负责处理爬取的数据。当A构造完后,通知B开始爬取,B爬取完通知C开始处理数据。这个需求可以利用方法的调用去完成,但进程的耦合度高,不建议使用。
业内中,针对这一现象就出现了消息队列的中间件,例如Rabbitmq,RocketMQ,Kafka等,本文介绍的是Rabbitmq,
准备工作:
请确保已经安装好了RabbitMq服务,其次还需要安装一个操作RabbitMq的python库,叫pike,使用命令:
pip3 install pika
基本使用
首先,RabbitMQ就是一个消息队列,我们要实现进程通信,从本质上它就是生产者--消费者模型,即一个进程作为生产者,将信息放入到消息队列,另一个进程则通过消息队列将信息取出,主要有三个点需要关注:
1. 声明队列(创建一个produce.py文件):
# 消息队列rabbitmq-生产者
import pika
QUEUE_NAME = "scrape"
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) # 连接本地rabbitmq服务
channel = connection.channel() # 频道对象 利用它可以操作队列内消息的生产和消费
channel.queue_declare(queue=QUEUE_NAME) # 声明一个消息队列,队列名称为scrape
2. 生产内容:
channel.basic_publish(exchange='', routing_key=QUEUE_NAME, body='Hello,Rabbitmq!') # 将数据存储到消息队列中,用到basic_publish
3. 消费内容(创建一个consumer.py文件):
# 消息队列rabbitmq-消费者
import pika
QUEUE_NAME = "scrape"
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) # 连接本地rabbitmq服务
channel = connection.channel() # 频道对象 利用它可以操作队列内消息的生产和消费
channel.queue_declare(queue=QUEUE_NAME) # 声明一个消息队列,队列名称为scrape
# 从队列获取数据
def getData(ch, method, properties, body):
print(f"得到{body}")
channel.basic_consume(queue=QUEUE_NAME, auto_ack=True, on_message_callback=getData) # 从消息队列中取出数据,用到basic_consume
channel.start_consuming()
4. 演示
首先本地运行consumer.py,其次运行produce.py文件,最后返回consumer.py观察控制台,是否从消息队列中取出信息,如图:
以上便是RabbitMQ的基础使用