一、Celery的基础介绍

1.celery简介
  • Celery 是一个异步任务队列/基于分布式消息传递的作业队列。其本质是生产者和消费者模式。生产者发送任务到消息队列,消费者负责处理任务。
2.celery 的架构
  • Celery的架构由三部分组成:消息中间件(Broker)、任务执行单元Worker、结果存储(Backend)。
  • 消息中间件Broker:支持RabbitMQ、Redis、Amazon SQS、MongoDB、Memcached 等,官方推荐RabbitMQ
  • 任务执行单元Worker:负责从消息队列中取出任务执行,它可以启动一个或者多个,也可以启动在不同的机器节点,这就是其实现分布式的核心。
  • 结果存储Backend:支持RabbitMQ、 Redis、Memcached,SQLAlchemy, Django ORM、Apache Cassandra、Elasticsearch
3.celery 工作原理
  • 1.任务模块Task包含异步任务和定时任务。
  • 异步任务通常在业务逻辑中被触发并发往消息队列,
  • 定时任务由Celery Beat进程周期性地将任务发往消息队列
  • 2.任务执行单元Worker实时监视消息队列获取队列中的任务执行
  • 3.Woker执行完任务后将结果保存在Backend中
4.安装

由于celery是有python开发,所以可以使用pip包管理工具直接下载
pip install celery

5.使用
  • 不使用配置文件的简单使用
  • 在assets应用模块的__init__.py 创建celery实例
  • tests.py:任务定义文件
import time
from assets import app

@app.task
def add(x, y):
    time.sleep(5)     # 模拟耗时操作
    return x + y
  • 启动worker
    celery worker -A assets.tests -l debug
  • worker: 代表启动的角色是worker,当然还有beat等其它角色
  • A: 项目路径,这里我的项目引用路径是assets.tests
  • l: 启动的日志级别,这里我启用了debug级别
    查看日志输出,会发现我们定义的任务
  • 现在worker启动了,但是我们需要用delay或apply_async来将任务添加到worker中。这里我们使用交互方式来添加任务,并返回AsyncResult对象,通过AsyncResult对象获取结果.
  • a = add.delay(args),发送任务到队列中
  • ready(): 判断任务是否有结果,返回True or False
  • state:返回任务状态
  • task_id: 返回任务id
  • result: 返回任务结果,同get()方法
  • info: 获取任务信息,默认返回结果
  • successful(): 判断任务是否成功,返回True or False
  • 使用配置文件
  • 这里我把配置文件写在const.py文件,可自行决定写什么文件名(一般config比较见名知意)
BROKER_URL = 'redis://127.0.0.1:6379/10' # Broker配置,使用Redis作为消息中间件
  
  CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/11' # BACKEND配置,这里使用redis
  
  CELERY_RESULT_SERIALIZER = 'json' # 结果序列化方案
  
  CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24 # 任务过期时间
  
  CELERY_TIMEZONE='Asia/Shanghai'   # 时区配置
  
  CELERY_IMPORTS = (     # 指定导入的任务模块,可以指定多个
      'assets.tests',
  )
  • 加载配置模块
  • kafkalytic插件配置_celery详解

  • tests.py:定义任务
import time
from assets import app

@app.task
def add(x, y):
    time.sleep(5)     # 模拟耗时操作
    return x + y
  • 启动worker, 这里这次试用日志级别为info, 可以看到我们的定义的add任务
    celery worker -A assets.tests -l info
  • kafkalytic插件配置_celery详解_02


总结:

  • celery 消息中间件(Broker)、任务执行单元Worker、结果存储(Backend)组成
  • 业务逻辑触发发送任务给消息队列,任务执行单元worker实时监听获取消息队列中的任务执行,worker执行任务后将结果保存在Backen中
  • 应用场景:
  • web应用:当用户在网站进行某个操作需要很长时间完成时,我们可以将这种操作交给Celery执行,比如发送邮件
  • 任务场景:比如在运维场景下需要批量在几百台机器执行某些命令或者任务
  • 定时任务:向定时导数据报表、定时发送通知类似场景
  • 定时任务的使用 下个章节分析