什么是celery
- celery是python开发的简单的,灵活可靠的,处理大量消息的分布式任务调度模块
- 专注于实时处理的异步任务队列
- 同时也支持任务调度
Celery本身不含消息服务,它使用第三方消息服务来传递任务,目前,Celery支持的消息服务有RabbitMQ、Redis、Amazon SQS;Celery 是用 Python 编写的,但协议可以用任何语言实现。除了 Python 语言实现之外,还有Node.js的 node-celery 和php的 celery-php 。
架构图
Celery的架构由三部分组成,消息中间件(message broker)、任务执行单元(worker)和 任务执行结果存储(task result store)组成。
启动celery服务(配置好broker和backend),手动或自动添加任务到broker中,broker将任务分发给worker,worker后台异步执行任务,执行完成后将结果存放到backend中。
安装
- Linux安装
pip安装
pip install celery
# 验证安装 查看版本
celery --version
---console---
5.2.3 (dawn-chorus)
使用redis作为backend和broker,需要本机安装redis,并启动redis-server,还需要安装Python第三方模块redis
pip install redis
- windows安装
由于官方不支持windows安装和使用,需要借助Python第三方模块eventlet,此模块主要作用通过协程实现并发。
pip install celery
pip install eventlet
# 验证安装 查看版本
celery --version
基本使用
- 目录结构
celery对目录要求严格,如果不在目录下加入__init__.py,worker执行任务可能会出现NotRegistered的情况
test
__init__
tasks.py
run.py
tasks.py
from celery import Celery
# 通过使用本机redis且没有密码,使用远程redis有密码格式为
# 'redis://:密码@ip:6379/1'
broker = 'redis://127.0.0.1:6379/1' # 任务储存
backend = 'redis://127.0.0.1:6379/2' # 结果存储,执行完之后结果放在这
# 创建出app对象
app = Celery(__name__, broker=broker, backend=backend)
# 任务通过装饰器@app.task进行装饰
@app.task
def add(x, y):
return x + y
run.py
from tasks import add
# 添加任务
# 返回一个 AsyncResult 实例,可以用于进行跟踪任务状况
result = add.delay(3,4)
print(result
- 启动worker
# 需要cd到tasks文件对应的路径
# 启动一个worker,日志打印级别为info
# windows平台启动
# celery -A tasks worker -l info -P eventlet
# linux启动
# 格式为:celery -A app对象所在的文件 worker -l 日志级别
celery -A tasks worker -l info
- 停止worker
直接通过Ctrl+c停止即可