Celery:一个专注于实时处理和任务调度的分布式任务队列

一、celery简介

Celery 是一个专注于实时处理和任务调度的分布式任务队列, 同时提供操作和维护分布式系统所需的工具,任务就是消息, 消息中的有效载荷中包含要执行任务需要的全部数据.它是一个分布式队列的管理工具, 可以用 Celery 提供的接口快速实现并管理一个分布式的任务队列.

二、celery特性:

1.方便查看定时任务的执行情况, 如 是否成功, 当前状态, 执行任务花费的时间等.

2.使用功能齐备的管理后台或命令行添加,更新,删除任务.

3.方便把任务和配置管理相关联.

4.多进程, Eventlet 和 Gevent 三种模型并发执行.

5.提供错误处理机制.

6.提供多种任务原语, 方便实现任务分组,拆分,和调用链.

7.支持多种消息代理和存储后端.

8.Celery 是语言无关的.它提供了python 等常见语言的接口支持.

三、celery相关组件:

Celery Beat : 任务调度器. Beat 进程会读取配置文件的内容, 周期性的将配置中到期需要执行的任务发送给任务队列.

Celery Worker : 执行任务的消费者, 通常会在多台服务器运行多个消费者, 提高运行效率.

Broker : 消息代理, 队列本身. 也称为消息中间件. 接受任务生产者发送过来的任务消息, 存进队列再按序分发给任务消费方(通常是消息队列或者数据库).

Producer : 任务生产者. 调用 Celery API , 函数或者装饰器, 而产生任务并交给任务队列处理的都是任务生产者.

Result Backend : 任务处理完成之后保存状态信息和结果, 以供查询.

celery的架构图如下:

四、celery支持的序列化

在客户端和消费者之间传输数据需要 序列化和反序列化. Celery支持的序列化如下:

1.pickle:python标准库的一个模块,支持python内置的数据结构,celery官方不推荐

2.json:支持多种语言,可用于跨语言方案

3.yaml:表达能力更强,支持的数据类型也比较多,但是性能方面稍逊json

4.msgpack:二进制的类json序列化方案,比json数据结构更小更快

五、celery的简单使用

1.使用redis作为broker和backend来演示一下celery的使用,首先启动redis,使用db1作为broker和backend:

2.使用下面命令安装celery的模块和redis模块:

pip install celery==4.1
pip install redis==3.3.11

3.编写tasks文件:

# -*- coding: utf-8 -*-
# @File : tasks.py
from __future__ import absolute_import, unicode_literals
from celery_tasks import celeryconfig
from celery import Celery

app = Celery('tasks', config_source=celeryconfig)


@app.task
def add(x, y):
 return x + y

配置文件celeryconfig内容是:

# -*- coding: utf-8 -*-

BROKER_URL = 'redis://:[email protected]:6379/1'
CELERY_RESULT_BACKEND = 'rpc'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_RESULT_EXPIRES = 60*30
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TIMEZONE = 'Asia/Shanghai'

CELERY_TASK_PUBLISH_RETRY_POLICY = {
 'max_retries': 3,
 'interval_start': 0,
 'interval_step': 0.2,
 'interval_max': 0.2
}

# 队列
CELERY_QUEUES = {
 'add': {
 'routing_key': 'add'
 }
}

CELERY_ROUTES = {
 'tasks.add': {
 'queue': 'add',
 'routing_key': 'add'
 }
}
4.启动celery:

使用命令celery -A celery_tasks.tasks worker --concurrency=2 --loglevel=debug进行启动,concurrency是启动work的数量,loglevel是日志的级别:

redis中也有了值:

查看一下启动的worker:

看到会有三个进程,这时由于celery是master-worker的架构模式,一个主进程负责调度,然后多个从进程负责消费具体的任务,也就是调度器和工作进程。

5.对于 celery任务的使用

redis中也存储了相关计算值:

六、配置文件说明

1.BROKER_URL:broker地址
2.CELERY_RESULT_BACKEND:结果存储地址
3.CELERY_TASK_SERIALIZER:任务序列化方式
4.CELERY_RESULT_SERIALIZER:结果序列化方式
5.CELERY_TASK_RESULT_EXPIRES:任务过期时间
6.CELERY_ACCEPT_CONTENT:指定任务接受的内容类型
7.CELERY_TASK_PUBLISH_RETRY_POLICY:任务发布策略
8.CELERY_QUEUES:队列配置
9.CELERY_ROUTES:路由设置

七、任务状态回调:

1.PENDING:任务等待中
2.STARTED:任务已开始
3.SUCCESS:任务成功
4.FAILURE:任务失败
5.RETRY:任务重试
6.REVOKED:任务取消
7.PROGRESS:任务进行中

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章