flask中celery介绍及使用celery实现异步任务

参考资料:
Celery 官网:http://www.celeryproject.org/
Celery 官方文档英文版:http://docs.celeryproject.org/en/latest/index.html
Celery 官方文档中文版:http://docs.jinkan.org/docs/celery/

Celery简介
除Celery是一个异步任务的调度工具。 Celery 是 Distributed Task Queue,分布式任务队列,分布式决定了可以有多个 worker 的存在,队列表示其是异步操作,即存在一个产生任务提出需求的工头,和一群等着被分配工作的码农。
Broker
在 Python 中定义 Celery 的时候,我们要引入 Broker(消息中间件),中文翻译过来就是“中间人”的意思,在这里 Broker 起到一个中间人的角色。在工头提出任务的时候,把所有的任务放到 Broker 里面,在 Broker 的另外一头,一群码农等着取出一个个任务准备着手做。
Backend
这种模式注定了整个系统会是个开环系统,工头对于码农们把任务做的怎样是不知情的。所以我们要引入 Backend 来保存每次任务的结果。这个 Backend 有点像我们的 Broker,也是存储任务的信息用的,只不过这里存的是那些任务的返回结果。我们可以选择只让错误执行的任务返回结果到 Backend,这样我们取回结果,便可以知道有多少任务执行失败了。
Celery应用场景
1.你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情。
2.你想做一个定时任务,比如每天检测一下你们所有客户的资料,如果发现今天 是客户的生日,就给他发个短信祝福

Celery的特点
1.简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的
2.高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务
3.快速:一个单进程的celery每分钟可处理上百万个任务
3.灵活: 几乎celery的各个组件都可以被扩展及自定制

Celery工作基本流程
这里写图片描述

Celery的安装
在flask中,打开终端直接执行一下命令即可安装:

pip install celery

因为我们在使用celery的过程中,需要用到redis数据库,请事先配置好redis数据库,确保数据库可以正常使用。

开始使用Celery
看一下程序目录
这里写图片描述

我们把main.py作为启动文件,config.py里面包含celery的配置信息,sms目录下的tasks.py(这个名字不能变,只能是这个)里面是我们要去执行的任务,这个例子是实现了一个网站注册界面实现异步任务给用户发送注册信息的功能。因为发送短信我们是依托于第三方平台,当我们需要发送短信的时候,需要向第三方平台发送请求与传递数据,所以这是一个耗时的操作,我们使用异步任务来提升用户的体验度。
下面就来看一下代码:
main.py

#coding:utf-8
from celery import Celery

app=Celery("ihome")
app.config_from_object("ihome.tasks.config")
#让celery自己找到任务
app.autodiscover_tasks(["ihome.tasks.sms"])

config.py

#coding:utf-8
#配置worker
BROKER_URL="redis://127.0.0.1:6379/5"
#配置backend
CELERY_RESULT_BACKEND="redis://127.0.0.1:6379/6"

tasks.py

#coding:utf-8
from celery import Celery

from ihome.libs.yuntongxun.sms import CCP

#创建celery对象
app=Celery("ihome",broker="redis://127.0.0.1:6379/5")

#定义任务
@app.task
def send_template_sms(to,datas,temp_id):
    '''发送短信'''
    #调用第三方平台发送短信程序
    ccp=CCP()
    ret=ccp.sendTemplateSMS(to,datas,temp_id)
    return ret

在我们后端程序中,在需要发送短信的地方使用以下语句:

tasks.send_template_sms.delay(mobile,[sms_code, str(constants.SMS_CODE_REDIS_EXPIRES / 60)],1)

delay里面的参数可以根据你使用的第三方平台来确定。

猜你喜欢

转载自blog.csdn.net/weixin_40612082/article/details/81149592