flask、celery+redis 实现定时任务和异步——(一)

1. 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工作基本流程
在这里插入图片描述

我们的项目
项目目录:
在这里插入图片描述

from __future__ import absolute_import, unicode_literals
from celery import Celery

app = Celery('proj',
            broker = 'amqp://',
            backend = 'amqp://',
            include = ['proj.tasks'])

app.conf.update(
    result_expires = 3600
)

if __name__ == '__main__':
    app.start()

在这个模块中创建了Celery实例(通常称为app)

要在项目中使用Celery只需要通过import导入该实例就行了

  • broker参数指定要使用的中间件的URL

  • backend参数指定使用的result backend
    用来跟踪任务状态和结果,虽然默认状态下结果不可用。以上例子中使用RPC result backend。当然,不同的result backend都有自己的好处和坏处,根据自己实际情况进行选择,如果不需要最好禁用。通过设置@task(ignore_result=True)选项来禁用耽搁任务)

  • include参数是当worker启动时导入的模块列表需要在这里添加自己的任务模块这样worker就可以找到任务

proj/tasks.py

from __future__ import absolute_import, unicode_literals
from .celery import app

@app.task
def add(x, y):
    return x + y

@app.task
def mul(x, y):
    return x * y
    
@app.task
def xsum(numbers):
    return sum(numbers)

启动worker
Celery程序可以用来启动worker:

celery -A proj worker -l info
 -------------- celery@centos6 v4.1.0 (latentcall)
---- **** ----- 
--- * ***  * -- Linux-2.6.32-696.el6.x86_64-x86_64-with-centos-6.9-Final 2018-03-26 12:27:49
-- * - **** --- 
- ** ---------- [config]
- ** ---------- .> app:         task:0x7fe5cfbd20d0
- ** ---------
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值