腾讯蓝鲸框架下Celery的使用
Celery是一个异步任务队列/基于分布式消息传递的作业队列,它支持很多任务类型,例如后台任务,定时任务,周期性任务等
一、Celery的工作结构
用户将消息推送给broker,broker将任务存入队列,此时worker一直监听任务队列,如果有,则获取并且去执行,然后将执行结果存储到store。如果worker没有开启或者处理不过来时,borker会出现消息队列堵塞的情况。
简单的理解:毕业季到了,一些公司会给老师一些offer名额,而这个老师就是broker。学生就是worker,我们想要offer就得去老师那里获取。然后worker把面试结果返回给store。
二、任务1
假如我们有一个业务,当用户登录我们系统之后,发现该用户的ip不在常用的地点时,就发送一个邮件给email进行确认。
假设我们的业务逻辑代码如下:
# tasks.py
import time
def check_ip(ip):
ip_list = [1, 2, 3, 4, 5, 6] # 常用ip地址
if ip in ip_list:
return "欢迎登录"
else:
# 模仿后台调用email接口去向用户发送数据
time.sleep(10)
return "由于您在不常用地点登录,请在邮箱进行确认后再次登录"
我们使用python manage.py shell
进入编辑界面
会发现,如果输入的数字在ip_list内的话,马上就会返回一个结果,但不在里面的话,就会等待10s。但是设想以下,如果有100个人来访问服务器,每个人都在不同的地方进行登录的话,后端就会被阻塞。这将严重影响用户体验。
因为邮箱、验证码等都是一些时效性不那么严谨的东西。那我们是否可以这样:当用户登录之后,直接返回一个结果,将处理事件放到另一个后台进行处理,这样就能保证主服务器的正常运行,同时也能让邮箱等正常的发送给用户。这里就需要用到celery。
三、任务1-1
要用到celery我们就需要下载,这里可以直接使用pip进行下载。然后当下载完之后,在后台进行简单的配置。我们就可以来完成一个简单的异步任务了。
import time
from celery.task import task
@task()
def check_ip(ip):
ip_list = [1, 2, 3, 4, 5, 6]
if ip in ip_list:
return "欢迎登录"
else:
# 模仿后台调用email接口去向用户发送数据
time.sleep(10)
return "由于您在不常用地点登录,请在邮箱进行确认后再次登录"
代码配置好之后,就需要将该文件在后台进行注册:
# CELERY 开关,使用时请改为 True,修改项目目录下的 Procfile 文件,添加以下两行命令:
# worker: python manage.py celery worker -l info
# beat: python manage.py celery beat -l info
# 不使用时,请修改为 False,并删除项目目录下的 Procfile 文件中 celery 配置
IS_USE_CELERY = True
# CELERY 并发数,默认为