celery的简介

  celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度。它的执行单元为任务(task),利用多线程,如Eventlet,gevent等,它们能被并发地执行在单个或多个职程服务器(worker servers)上。任务能异步执行(后台运行)或同步执行(等待任务完成)。
  在生产系统中,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 支出的序列化方案如下所示:

准备工作

  在本文中,我们使用的celery的消息代理和后端存储数据库都使用redis,序列化和反序列化选择msgpack。
  首先,我们需要安装redis数据库,具体的安装方法可参考:http://www.runoob.com/redis/r... 。启动redis,我们会看到如下界面:

在redis可视化软件rdm中,我们看到的数据库如下:

里面没有任何数据。
  接着,为了能够在python中使用celery,我们需要安装以下模块:

  • celery
  • redis
  • msgpack

这样,我们的准备工作就完毕了。

一个简单的例子

  我们创建的工程名称为proj,结构如下图:

  首先是主程序app_test.py,代码如下:

from celery import Celeryapp = Celery('proj', include=['proj.tasks'])
app.config_from_object('proj.celeryconfig')if __name__ == '__main__':app.start()

分析一下这个程序:

  1. "from celery import Celery"是导入celery中的Celery类。
  2. app是Celery类的实例,创建的时候添加了proj.tasks这个模块,也就是包含了proj/tasks.py这个文件。
  3. 把Celery配置存放进proj/celeryconfig.py文件,使用app.config_from_object加载配置。

  接着是任务函数文件tasks.py,代码如下:

import time
from proj.app_test import app@app.task
def add(x, y):time.sleep(1)return x + y

tasks.py只有一个任务函数add,让它生效的最直接的方法就是添加app.task这个装饰器。add的功能是先休眠一秒,然后返回两个数的和。

  接着是配置文件celeryconfig.py,代码如下:

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

  最后是调用文件diaoyong.py,代码如下:

from proj.tasks import add
import timet1 = time.time()r1 = add.delay(1, 2)
r2 = add.delay(2, 4)
r3 = add.delay(3, 6)
r4 = add.delay(4, 8)
r5 = add.delay(5, 10)r_list = [r1, r2, r3, r4, r5]
for r in r_list:while not r.ready():passprint(r.result)t2 = time.time()print('共耗时:%s' % str(t2-t1))

在这个程序中,我们调用了add函数五次,delay()用来调用任务。

例子的运行

  到此为止,我们已经理解了整个项目的结构与代码。
  接下来,我们尝试着把这个项目运行起来。
  首先,我们需要启动redis。接着,切换至proj项目所在目录,并运行命令:

celery -A proj.app_test worker -l info

界面如下:

然后,我们运行diaoyong.py,输出的结果如下:

3
6
9
12
15
共耗时:1.1370790004730225

后台输出如下:

接着,我们看一下rdm中的数据:

至此,我们已经成功运行了这个项目。
  下面,我们尝试着对这个运行结果做些分析。首先,我们一次性调用了五次add函数,但是运行的总时间才1秒多。这是celery异步运行的结果,如果是同步运行,那么,至少需要5秒多,因为每调用add函数一次,就会休眠一秒。这就是celery的强大之处。
  从后台输出可以看到,程序会先将任务分发出来,每个任务一个ID,在后台统一处理,处理完后会有相应的结果返回,同时该结果也会储存之后台数据库。可以利用ready()判断任务是否执行完毕,再用result获取任务的结果。
  本文项目的github地址为:https://github.com/percent4/c... 。
  本次分享到此结束,感谢阅读~
  注意:本人现已开通微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注哦~~

参考文献

  1. Celery 初步:http://docs.jinkan.org/docs/c...
  2. 使用Celery:https://zhuanlan.zhihu.com/p/...
  3. 异步神器celery:https://www.jianshu.com/p/9be...

Python之celery的简介与使用相关推荐

  1. python消息队列celery_【干货分享】NTI任务管理之django+python篇celery异步任务使用...

    阅读: 3,538 新浪微博的新鲜事推送如何实现?大规模的服务器如何实现Crontab管理?里面的秘密就在于消息队列.Celery是一个使用Python开发的分布式任务调度模块,是一个简单.灵活.可靠 ...

  2. python之celery简单使用

    python之celery简单使用 参考:https://blog.csdn.net/zt3032/article/details/79251888 celery是一个简单.灵活和可靠的分布式任务处理 ...

  3. Python whl文件制作简介

    Python whl文件制作简介 whl文件 为什么需要whl文件 whl文件 whl格式本质上是一个压缩包,里面包含了py文件,以及经过编译的pyd文件.使得可以在不具备编译环境的情况下,选择合适自 ...

  4. Py之mglearn:python库之mglearn简介、安装、使用方法之详细攻略

    Py之mglearn:python库之mglearn简介.安装.使用方法之详细攻略 目录 mglearn简介 1.英文解释 mglearn安装 mglearn使用方法 1.Helper functio ...

  5. Py之imgaug:Python库之imgaug简介、安装、使用方法之详细攻略

    Py之imgaug:Python库之imgaug简介.安装.使用方法之详细攻略 目录 imgaug简介 imgaug安装 imgaug使用方法 imgaug简介 用于机器学习实验中的图像增强的库,特别 ...

  6. Py之twisted:Python库之twisted简介、安装、使用方法等详细攻略

    Py之twisted:Python库之twisted简介.安装.使用方法等详细攻略 目录 twisted简介 twisted安装 twisted使用方法 twisted简介 twisted 是pyth ...

  7. Py之ipykernel:Python库之ipykernel简介、安装、使用方法之详细攻略

    Py之ipykernel:Python库之ipykernel简介.安装.使用方法之详细攻略 目录 ipykernel简介 1.特点 ipykernel安装 ipykernel使用方法 1.Kernel ...

  8. Py之pytest-shutil:Python库之pytest-shutil简介、安装、使用方法之详细攻略

    Py之pytest-shutil:Python库之pytest-shutil简介.安装.使用方法之详细攻略 目录 pytest-shutil简介 pytest-shutil安装 pytest-shut ...

  9. Py之docx:Python库之docx简介、安装、使用方法详细攻略

    Py之docx:Python库之docx简介.安装.使用方法详细攻略 目录 Python库之docx简介 Python库之docx安装 docx使用方法 1.打开文档

最新文章

  1. Word2010开发——操作文档
  2. YOLO-6D论文的一些相关知识
  3. python boxplot pvalue_1.1.1数据质量分析Python boxplot,111,箱,线图
  4. 技术揭秘之详解回收站删除文件恢复
  5. error: Refusing toundefine while domain managed save image exists
  6. Debian10降级安装php,如何在Debian 10 Linux上安装PHP
  7. 庆祝我的第一个WebGis完成-c#+MapXtreme2004
  8. 利用matlab使用窗函数,Matlab中窗函数的简单使用
  9. python类中变量作用域_说说Python中变量的作用域?
  10. 《Redis视频教程》(p18)
  11. 深度解读设备的“万能语言”鸿蒙系统的分布式软总线能力
  12. linux中ftp禁止匿名,linux下禁止root和匿名用户登录ftp
  13. 天龙八部科举答题问题和答案(全3/8)
  14. 英语 动画 教学 字母_字母形式在阅读教学中的作用
  15. ESP32-CAM、ESP8266、WIFI、蓝牙、单片机、热点创建嵌入式DNS服务器
  16. 一个时代的终结:为什么是时候放弃ITOM四大巨头了?这对IT领导者来说意味着什么?
  17. 计算机没有外审的核心期刊,国内核心期刊投稿经验总结战友们共同分享丁香园论坛...
  18. 西游记中如来佛祖来降服孙悟空时为什么说可惜他的真面目
  19. 原装ipad手写笔有必要买吗?第三方iPad手写笔推荐
  20. GPT3类自动补全助手,个体+超级团队成为可能 | 技术趋势

热门文章

  1. mysql写下拉树_PHP+mysql实现从数据库获取下拉树功能的方法
  2. 天宫初级认证答案_百度初级认证试题答案
  3. android 百度地图开发 怎么减小包的大小,最新的百度地图Android开发包中,如何隐藏右下角的放大缩小控件...
  4. java 对象池 实现_Java对象池技术的原理及其实现
  5. JAVA数组扁平化整合_5种方法实现数组扁平化
  6. mysql msdtc 不支持_IIS5.1安装后,不支持IIS的问题。(转)
  7. java spring mvc json ajax 优势_SpringMVC后台json数据前台ajax获取不到!!!急求解答!!!...
  8. 多线程 循环 锁_大多数人还不清楚的iOS多线程
  9. vnc用户名 查看linux_vnc用户名未被识别,5步教你如何解决vnc用户名未被识别
  10. H5 中 bordercolorlight 属性的用法及作用