Celery简介

celery userguide

知乎大神解释celery

Celery(芹菜)是基于Python开发的分布式任务队列。它支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度。

Celery架构

架构图如下:

Celery包括如下组件:

  • Celery Beat

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

  • celery Worker

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

  • Broker

消息代理,或者叫做消息中间件,接受任务生产者发送过来的任务消息,存进队列在按序分发给任务消费方(通常是消息队列或者数据库)

  • Producer

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

  • Result Backend

任务处理完后保存状态信息和结果,以供查询。Celery默认已支持 Redis,RabbitMQ, MongoDB,Django ORM,SQLAIchemy等方式

中间件选择

Celery目前支持很多第三方软件作为消息代理,但适用于生产环境的只有RabbitMQ和Redis,至于其他的方式,一是支持有限,二是可能得不到更好的技术支持。Celery官方推荐的是RabbitMQ。

Celery序列化

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

方案 说明
pickle pickle是Python标准库中的一个模块,支持Python内置的数据结构,但是它是Python的专有协议。
从Celery3.2开始,由于安全性等原因Celery将拒绝pickle这个方案
json json支持多种语言,可用于跨语言方案
yaml yaml的表达能力更强,支持的数据类型比json多,但是python客户端的性能不如json
msgpack msgpack是一个二进制的类json的序列化方案,但是比json的数据结构更小、更快

简单项目

项目目录结构如下:

/root/test/proj/celery
├── celeryconfig.py
├── celery.py
├── __init__.py
└── tasks.py

先看一下主程序celery.py:

#!/usr/bin/env python
#coding:utf8 #拒绝隐式引入,因为celery.py的名字和celery的包名冲突,需要使用这条语句让程序正常运行,否则“from celery import Celery”这条语句将会报错,因为首先找到的celery.py文件中并没有Celery这个类
from __future__ import absolute_import
from celery import Celery # app是Celery类的实例,创建的时候添加了celery.tasks这个模块,也就是包含了celery/tasks.py这个文件
app = Celery('celery',include=['celery.tasks']) # 把Celery配置存放进celery/celeryconfig.py文件,使用app.config_from_object加载配置
app.config_from_object('celery.celeryconfig') if __name__ == "__main__":
app.start()

存放任务函数的文件tasks.py:

#!/usr/bin/env python
#coding:utf8 from __future__ import absolute_import
from celery.celery import app @app.task
def add(x, y):
return x+y

tasks.py只有一个任务函数add,让它生效的最直接的方法就是添加app.task这个装饰器。

celery配置文件celeryconfig.py:

# 使用Redis作为消息代理
BROKER_URL = 'redis://192.168.189.100:6379/0' # 把任务结果保存在Redis中
CELERY_RESULT_BACKEND = 'redis://192.168.189.100:6379/1' # 任务序列化和反序列化使用msgpack方案
CELERY_TASK_SERIALIZER = 'msgpack' # 读取任务结果一般性能要求不高,所以使用了可读性更好的JSON
CELERY_RESULT_SERIALIZER = 'json' # 任务过期时间,这样写更加明显
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24 # 指定接受的内容类型
CELERY_ACCEPT_CONTENT = ['json', 'msgpack']

这个例子中没有任务调度相关的内容,如果有的话就要使用Queue类了,所以只需要启动消费者:

celery -A proj worker -l info

-A参数默认会寻找proj.celery这个模块,其实使用celery作为模块文件名字不怎么合理。可以使用其他名字。举个例子,假如是proj/app.py,可以使用如下命令启动:

celery -A proj.app worker -l info

celery简介的更多相关文章

  1. Celery简介以及Django中使用celery

    目录 Celery简介 消息中间件 任务执行单元 任务结果存储 使用场景 Celery的安装和配置 Celery执行异步任务 基本使用 延时任务 定时任务 异步处理Django任务 案例: Celer ...

  2. Python 任务队列 Celery

    一. celery 简介 Celery 是一个专注于实时处理和任务调度的分布式任务队列, 同时提供操作和维护分布式系统所需的工具.. 所谓任务就是消息, 消息中的有效载荷中包含要执行任务需要的全部数据 ...

  3. Django使用Celery异步任务队列

    1  Celery简介 Celery是异步任务队列,可以独立于主进程运行,在主进程退出后,也不影响队列中的任务执行. 任务执行异常退出,重新启动后,会继续执行队列中的其他任务,同时可以缓存停止期间接收 ...

  4. Python 并行分布式框架 Celery

    Celery 简介 除了redis,还可以使用另外一个神器---Celery.Celery是一个异步任务的调度工具. Celery 是 Distributed Task Queue,分布式任务队列,分 ...

  5. 【理论】python使用celery异步处理请求

    Flask中使用celery队列处理执行时间较长的请求. 一. 安装celery pip install celery flask redis 二. celery简介 Celery是个异步分布式任务队 ...

  6. Python之celery

    一.celery简介 Celery是一个Python开发的异步分布式任务调度模块.celery本身不提供消息服务,使用第三方服务,也就是borker来传递任务,目前支持rebbing, redis, ...

  7. Python学习笔记 - day14 - Celery异步任务

    Celery概述 关于celery的定义,首先来看官方网站: Celery(芹菜) 是一个简单.灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具. 简单来看,是一个基于pyt ...

  8. 分布式任务队列--Celery的学习笔记

    一.Celery简介 Celery是一个简单,灵活,可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具.它是一个任务队列,专注于实时处理,同时还支持任务调度. 所谓任务队列,是一 ...

  9. Celery在Django中的使用介绍

    Celery在Django中的使用介绍 Celery简介 celery是一个简单.灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必须工具. 它是一个专注于实时处理的任务队列,同时也 ...

随机推荐

  1. 初识Linq to Entity

    技术介绍: LINQ(Language Integrated Query,语言集成查询)是一组用于C#和VB.NET语言的扩展,它允许编写C#或者VB.net代码,以与查询数据库相同的方式操作内存数据 ...

  2. zabbix短信(阿里云短信平台)与邮件报警

    环境说明 操作系统 centos7 zabbix_server zabbix 4.0.3 python 3.6.5 短信平台 阿里云短信 zabbix_server配置信息 1 [root@cp-hb ...

  3. BZOJ3158 千钧一发(最小割)

    可以看做一些物品中某些互相排斥求最大价值.如果这是个二分图的话,就很容易用最小割了. 观察其给出的条件间是否有什么联系.如果两个数都是偶数,显然满足条件二:而若都是奇数,则满足条件一,因为式子列出来发 ...

  4. Round 1 Over

    终于把题目清单上的 \(dp\) 写完了\(hhh\)

  5. uoj318 [NOI2017]蔬菜 【贪心 + 堆 + 并查集】

    题目链接 uoj 题解 以前看别人博客,在考场上用费用流做,一直以为这题是毒瘤网络流题 没想到竟然是贪心模拟题... 如果只有一个蔬菜呢?这就是一个经典的普及难度的贪心,正着推面临优先选择的困难,而逆 ...

  6. 洛谷 P1357 花园 解题报告

    P1357 花园 题目描述 小\(L\)有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为\(1~N(2<=N<=10^{15})\).他的环形花园每天都会换一个新花样,但他的花园都不 ...

  7. 【bzoj3209】 花神的数论题

    http://www.lydsy.com/JudgeOnline/problem.php?id=3209 (题目链接) 题意 ${sum(i)}$表示${i}$的二进制表示中${1}$的个数.求${\ ...

  8. 【bzoj2741】[FOTILE模拟赛] L

    Portal --> bzoj2741 Solution 突然沉迷分块不能自拔 考虑用分块+可持久化trie来解决这个问题 对于每一块的块头\(L\),预处理\([L,i]\)区间内的所有子区间 ...

  9. ASP.NET MVC 3 常用

    http://blog.csdn.net/churujianghu/article/details/7297358 1.ASP.NET MVC 3 如何去除默认验证 这个默认验证是在web.confi ...

  10. php与Git下基于webhook的自动化部署

    前言 2018年第一篇文章,没啥技术含量,权当笔记 我们一般都会用git或者svn来管理我们的代码 每次代码更新后还要手动的去把服务器上的代码也更新一遍 项目小了还好 项目大了着实浪费时间 要是服务器 ...