1.Celery简介
Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统。它专注于实时处理的异步任务队列,同时也支持任务调度。
Celery官方文档中文版:http://docs.jinkan.org/docs/celery/
我们通常使用Celery来实现异步任务(async task)和定时任务(Celery Beat)比如发邮件
Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成
附上架构图:


由此得知Celery主要包含以下几个模块:

- 任务模块 Task
包含异步任务和定时任务。其中,异步任务通常在业务逻辑中被触发并发往任务队列,而定时任务由 Celery Beat 进程周期性地将任务发往任务队列。

- 消息中间件 Broker
Broker,即为任务调度队列,接收任务生产者发来的消息(即任务),将任务存入队列。Celery 本身不提供队列服务,官方推荐使用 RabbitMQ 和 Redis 等。

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

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


Celery优点
- 简单:celery的 配置和使用还是比较简单的, 非常容易使用和维护和不需要配置文件
- 高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务
- 如果连接丢失或发生故障,worker和client 将自动重试,并且一些代理通过主/主或主/副本复制方式支持HA。
- 快速:一个单进程的celery每分钟可处理上百万个任务
- 灵活: 几乎celery的各个组件都可以被扩展及自定制

2.Celery的使用
创建Django项目,
目录如下:


- 安装
# 安装django-celery-results
pip install django-celery-results
# 安装Redis
pip install redis

 - 在setting文件中配置

INSTALLED_APPS = [
    ····
    'django_celery_results'
    ····
]

 -在setting同级目录下创建celery.py文件

# celery.py文件中
import os
from celery import Celery

# 为celery设置环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DjCelery.settings')
# 首先你需要一个 Celery 实例,称为 Celery 应用或直接简称应用
app = Celery('DjCelery')
#  从单独的配置模块中加载配置,导入celery配置
app.config_from_object('django.conf:settings')
app.conf.enable_utc = False
# 时区
app.conf.timezone = "Asia/Shanghai"
# 自动搜索任务
app.autodiscover_tasks()

-在setting同级目录__init__文件中
from .celery import app as celery_app

__all__ = ('celery_app',)

   -在app中创建tasks.py文件

from celery import shared_task

@shared_task
def add(x, y):
    return x + y

 -在views.py文件中调用它

from django.http import JsonResponse
from celery_app import tasks


def index(request, *args, **kwargs):
    try:
        # 例如我们希望在用户发出request后异步执行该task, 马上返回response,
        # 从而不阻塞该request, 使用户有一个流畅的访问过程.
        # 那么, 我们可以使用.delay
        # delay是注册为celery异步任务的关键点
        res = tasks.add.delay(1, 3)
    except Exception as e:
        print(e)
    else:
        # 返回执行结果和执行结果ID号
        return JsonResponse({'status': 'successful', 'task_id': res.task_id})

  


- 最后使用celery命令启动work

# 注意:需要切换目录到执行文件的目录下,否则会报错
cd celery_app
celery -A tasks worker  --loglevel=info
3. 总结:
本文简单介绍了 celery 的基本的功能 , 以及celery 能够处理的任务特点,以及可以和 flask 结合起来使用. 简单分析了 celery 的工作机制 . 当然 如果想要深入了解 celery,可以 参考 celery的官方文档.