一、任务队列概述
消息队列,顾名思义就是一个用来传递任务的队列。消息队列在开发中十分常见,经常用在页面后台处理需要很长时间的操作时,例如发送邮件、短信以及进行复杂数据运算操作等,这些操作通常会阻塞页面相当长的时间,为了避免用户等待太久,一般会先给用户页面进行相应,然后在后台使用独立的线程或者进程来处理这些复杂的操作。
消息队列分为两个部分,生产者和消费者。生产者负责把任务放进队列,消费者则负责从队列中取出任务执行。最常见的一个场景是:当我们在某个站点注册账号时,一般都会给我们的邮箱发送邮件验证,由于发送邮件比较耗时,并且邮件的实时性要求也不是很高,所以这里就可以使用消息队列来完成。先把发送邮件放到队列中,然后开启另外的一个线程专门读取任务,读取邮件并发送出去。
二、使用redis实现一个简单的任务队列
可以使用redis中的列表来实现一个任务队列,开启两个程序,一个作为生产者使用LPUSH
写队列,一个作为消费者使用RPOP
读队列,由于消费者并不知道什么时候会有数据过来,所以消费者需要一直循环读取数据。两者的消息使用json
进行封装协议传输。
生产者:
# -*- coding: utf8 -*-
"""
生产者模型
"""
import json
import redis
# 消息类型
MSG_TYPE_READ_BOOK = 0
MSG_TYPE_PLAY_GAME = 1
MSG_TYPE_SING_SONG = 2
def make_message(m_id, m_type):
"""
产生一个消息
:param m_id: 消息的id
:param m_type: 消息类型
:return: json字符串
"""
mess_dict = {
"id": m_id, "type": m_type}
return json.dumps(mess_dict)
def creator():
"""
生产消息并放入消息队列
"""
conn = redis.StrictRedis()
for i in range(