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