Python celery原理及运行流程解析


Posted in Python onJune 13, 2020

celery简介

celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度。它的执行单元为任务(task),利用多线程,如Eventlet,gevent等,它们能被并发地执行在单个或多个职程服务器(worker servers)上。任务能异步执行(后台运行)或同步执行(等待任务完成)。

在生产系统中,celery能够一天处理上百万的任务。它的完整架构图如下:

Python celery原理及运行流程解析

组件介绍:

  • Producer:调用了Celery提供的API、函数或者装饰器而产生任务并交给任务队列处理的都是任务生产者。
  • Celery Beat:任务调度器,Beat进程会读取配置文件的内容,周期性地将配置中到期需要执行的任务发送给任务队列。
  • Broker:消息代理,又称消息中间件,接受任务生产者发送过来的任务消息,存进队列再按序分发给任务消费方(通常是消息队列或者数据库)。Celery目前支持RabbitMQ、Redis、MongoDB、Beanstalk、SQLAlchemy、Zookeeper等作为消息代理,但适用于生产环境的只有RabbitMQ和Redis, 官方推荐 RabbitMQ。
  • Celery Worker:执行任务的消费者,通常会在多台服务器运行多个消费者来提高执行效率。
  • Result Backend:任务处理完后保存状态信息和结果,以供查询。Celery默认已支持Redis、RabbitMQ、MongoDB、Django ORM、SQLAlchemy等方式。

工作原理

它的基本工作就是管理分配任务到不同的服务器,并且取得结果。至于说服务器之间是如何进行通信的?这个Celery本身不能解决。所以,RabbitMQ作为一个消息队列管理工具被引入到和Celery集成,负责处理服务器之间的通信任务。和rabbitmq的关系只是在于,celery没有消息存储功能,他需要介质,比如rabbitmq、redis、mysql、mongodb 都是可以的。推荐使用rabbitmq,他的速度和可用性都很高。

Celery安装及使用

1、安装celery

pip install celery

2、查看完整可用命令选项

celery worker --help

3、创建一个工程项目project,然后再项目内创建一个celery_tasks异步任务列表。如图:

Python celery原理及运行流程解析

4、首先是celery_tasks异步任务主程序main.py,代码如下:

from celery import Celery
# 生成celery应用
celery_app = Celery("caicai")
# 加载配置文件
celery_app.config_from_object('celery_tasks.config')
# 注册任务
celery_app.autodiscover_tasks(['celery_tasks.email']) # 注意:传递的参数是任务列表

分析一下这个程序:

  • "from celery import Celery"是导入celery中的Celery类。celery_app
  • celery_app是Celery类的实例。
  • 把Celery配置存放进project/config.py文件,使用celery_app.config_from_object加载配置。
  • 将任务注册到应用中

5、接着是配置文件config.py,代码如下:

BROKER_URL = 'redis://localhost:6379/1' # 使用Redis作为消息代理

CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' # 把任务结果存在了Redis

# CELERY_TASK_SERIALIZER = 'msgpack' # 任务序列化和反序列化使用msgpack方案

CELERY_RESULT_SERIALIZER = 'json' # 读取任务结果一般性能要求不高,所以使用了可读性更好的JSON

CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24 # celery任务结果有效期

CELERY_ACCEPT_CONTENT = ['json', 'msgpack'] # 指定接受的内容类型

CELERY_TIMEZONE = 'Asia/Shanghai'       # celery使用的时区
CELERY_ENABLE_UTC = True            # 启动时区设置
CELERYD_LOG_FILE = "/var/log/celery/celery.log"   # celery日志存储位置

6、创建email目录,目录下创建tesks.py文件用来编写发送邮件的代码,代码如下:

import time
from celery_tasks.main import celery_app
@celery_app.task(name='seed_email')   # 添加celery_app.task这个装饰器,指定该任务的任务名name='seed_email'
def seed():
  time.sleep(1)
  return "我将发送邮件"

7、在项目app.py中,采用delay()用来调用任务。

from celery_tasks.email.tasks import seed
seed.delay()
seed.delay()
seed.delay()
seed.delay()
seed.delay()

8、项目运行

首先,我们需要启动redis。接着,切换至proj项目所在目录,并运行命令:

celery -A celery_tasks.main worker -l info

界面如下:

Python celery原理及运行流程解析

然后,我们运行app.py,app.py调用添加异步任务,输出的结果如下:

Python celery原理及运行流程解析

Python celery原理及运行流程解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python统计文本字符串里单词出现频率的方法
May 26 Python
浅谈python中的变量默认是什么类型
Sep 11 Python
使用Python3制作TCP端口扫描器
Apr 17 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
Aug 03 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
Nov 22 Python
Python机器学习之决策树算法
Dec 22 Python
Python生成器的使用方法和示例代码
Mar 04 Python
Python编写一个验证码图片数据标注GUI程序附源码
Dec 09 Python
使用pygame编写Flappy bird小游戏
Mar 14 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
Apr 08 Python
python与js主要区别点总结
Sep 13 Python
Python借助with语句实现代码段只执行有限次
Mar 23 Python
基于Python实现视频的人脸融合功能
Jun 12 #Python
使用Keras实现简单线性回归模型操作
Jun 12 #Python
Python实现Keras搭建神经网络训练分类模型教程
Jun 12 #Python
简单了解Python变量作用域正确使用方法
Jun 12 #Python
keras 读取多标签图像数据方式
Jun 12 #Python
Python数据可视化图实现过程详解
Jun 12 #Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
Jun 12 #Python
You might like
解析PHP将对象转换成数组的方法(兼容多维数组类型)
2013/06/21 PHP
php实现天干地支计算器示例
2014/03/14 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
js实现简单模态窗口,背景灰显
2008/11/14 Javascript
jquery自动切换tabs选项卡的具体实现
2013/12/24 Javascript
document节点对象的获取方式示例介绍
2013/12/24 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
深入浅析JavaScript中对事件的三种监听方式
2015/09/29 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
修改Nodejs内置的npm默认配置路径方法
2018/05/13 NodeJs
ElementUI多个子组件表单的校验管理实现
2019/11/07 Javascript
js仿京东放大镜效果
2020/08/09 Javascript
[01:25]DOTA2超级联赛专访iG 将调整状态找回自己
2013/06/05 DOTA
[53:36]Liquid vs VP Supermajor决赛 BO 第三场 6.10
2018/07/05 DOTA
Python中基础的socket编程实战攻略
2016/06/01 Python
解决python大批量读写.doc文件的问题
2018/05/08 Python
python机器学习之KNN分类算法
2018/08/29 Python
python自动化生成IOS的图标
2018/11/13 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
2020/02/26 Python
深入了解Python enumerate和zip
2020/07/16 Python
摩飞电器俄罗斯官方网站:Morphy Richards俄罗斯
2020/07/30 全球购物
介绍一下Python下range()函数的用法
2013/11/07 面试题
秋季红领巾广播稿
2014/01/27 职场文书
党的群众路线对照检查材料(个人)
2014/09/24 职场文书
不尊敬老师检讨书范文
2014/11/19 职场文书
2014年扫黄打非工作总结
2014/12/03 职场文书
高考升学宴答谢词
2015/01/20 职场文书
我的中国梦主题班会
2015/08/14 职场文书
Mysql数据库按时间点恢复实战记录
2021/06/30 MySQL
《金肉人》米特&《航海王》阿鹤声优松岛实因胰脏癌去世 享寿81岁
2022/04/13 日漫