Celery + Redis的异步任务详解

本文详细介绍了如何在Django中利用Celery和Redis创建异步任务,以提升用户体验。Celery是一个分布式任务队列,通过Broker(如Redis)存储任务,Worker执行任务,Backend存储结果。文中涵盖了任务定义、组件功能、实现步骤、配置Redis、编写任务和调用任务的全过程,提供了一种在Windows环境下配置Celery和Redis的示例。

一、背景

在开发过程中,有时会遇到一些需要执行时间很长的任务,如果放在前端,会让用户一直等待任务执行完或者一直转圈圈,用户体验非常不好。为了改善这种体验,使用异步的方法可以解决以上情况。在Django中,我们可以使用celery异步框架,我们可以把耗时的任务(或者定时的任务)交给后台执行,而前端给用户立即返回,待用户需要查看结果时,点击查看即可,并且可以随时看到任务执行的状态。

二、原理

Celery是基于Python开发的一个分布式任务队列框架,支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度。它是Python写的库,但是它实现的通讯协议也可以使用ruby,php,javascript等调用。异步任务除了消息队列的后台执行的方式,还是一种定时计划任务。

Celery 是一个强大的分布式任务队列,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。我们通常使用它来实现异步任务(async task)和定时任务(crontab)。它的架构组成如下图 :
在这里插入图片描述
组件:

1、任务(tasks)–用户定义的函数,用于实现用户的功能,比如执行一个耗时很长的任务

2、中间介(Broker)–用于存放tasks的地方,但是这个中间介需要解决一个问题,就是可能需要存放非常非常多的tasks,而且要保证Worker能够从这里拿取

3、执行者(Worker)–用于执行tasks,也就是真正调用我们在tasks中定义的函数

4、存储(Backend)–把执行tasks返回的结果进行存储,以供用户查看或调用

三、实现

1、各模块功能:
Celery中,以上组件具体功能如下:

任务模块 Task

包含异步任务和定时任务。其中,异步任务通常在业务逻辑中被触发(一般是在views.py中)并发往任务队列,而定时任务由 Celery Beat 进程周期性地将任务发往任务队列。

消息中间件 Broker

Broker,即为任务调度队列,接收任务,将任务存入队列。Celery 本身不提供队列服务,官方推荐使用 RabbitMQ 和 Redis 等。

Worker用来执行任务

Worker 是执行任务的处理单元,它实时监控消息队列,获取队列中调度的任务,并执行它。

任务结果存储 Backend

Backend 用于存储任务的执行结果,以供查询。同消息中间件一样,存储也可使用 RabbitMQ, Redis 和 MongoDB 等

2、实现步骤:
使用 Celery 实现异步任务主要包含三个步骤:

• 创建一个 Celery 实例
• 启动 Celery Worker
• 应用程序调用异步任务

3、操作流程:
a、环境安装(RabbitMQ/Redis、Celery、django-celery、flower)

b、新建文件

celery下面需要修改的文件:celery.py、init.py、settings文件

现在我们以一个实例来说明celery + redis的使用:
1、安装相关的包:
pip install celery
pip install redis
pip install eventlet
笔者在使用的是windos 7 + celery 4.4.6 + redis 3.5.3 + eventlet 0.25.2
在windos 7中安装redis。并设置登录密码:修改安装目录下的redis.windows-service.conf文件,增加:requirepass 123456,默认的密码为空。

2、配置redis,在安装的redis目录下,启动Redis:
C:\Program Files\Redis>redis-cli
127.0.0.1:6379> auth 123456 # 输入用户auth 输入密码。如果出现ok,说明redis服务正常。

3、编写celery异步任务:
在项目中(e_shop):
项目的e_shop的目录结构如下:
在这里插入图片描述
(1)首先在项目e_shop的目录下,新建一个文件celery_task.py文件:

# 用来保存保存项目的 Celery 配置
import os
from django.conf import settings
from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'e_shop.settings')

# 创建一个实例,创建应用实例
app = Celery('e_shop',
             broker='redis://:123456@127.0.0.1/0',
             backend='redis://:123456@127.0.0.1/0')

# 使用 config_from_object() 方法从项目设置加载自定义配置
app.config_from_object('django.conf:settings')
# 告诉 Celery 自动发现 INSTALLED_APPS 中的应用的异步任务
app.autodiscover_tasks
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值