Celery的实践指南
http://www.cnblogs.com/ToDoToTry/p/5453149.html
Celery的实践指南
- 客户端启动一个进程(生产者),当用户的某些操作耗时较长或者比较频繁时,考虑接入本消息系统,发送一个task任务给broker。
- 后台启动一个worker进程(消费者),当发现broker中保存有某个任务到了该执行的时间,他就会拿过来,根据task类型和参数执行。
- 简单的定时任务:
- 替换crontab的celery写法:
- from celery import Celery
from celery.schedules import crontab
app = Celery("tasks", backend="redis://localhost", broker="redis://localhost")
app.conf.update(CELERYBEAT_SCHEDULE = {
"add": {
"task": "celery_demo.add",
"schedule": crontab(minute="*"),
"args": (16, 16)
},
})
@app.task
def add(x, y):
return x + y
- from celery import Celery
- 运行celery的worker,让他作为consumer运行,自动从broker上获得任务并执行。
- `celery -A celery_demo worker`
- 运行celery的client,让其根据schedule,自动生产出task msg,并发布到broker上。
- `celery -A celery_demo beat`
- 安装并运行flower,方便监控task的运行状态
- `celery flower -A celery_demo`
- 或者设置登录密码 `
celery flower -A celery_demo --basic_auth=user1:password1,user2:password2
- 替换crontab的celery写法:
- 多同步任务-链式任务-
- 失败自动重试的task
- 失败重试方法: 将task代码函数参数增加self,同时绑定bind。
- demo代码:
- @app.task(bind=True, default_retry_delay=300, max_retries=5)
def my_task_A(self):
try:
print("doing stuff here...")
except SomeNetworkException as e:
print("maybe do some clenup here....")
self.retry(e)
- 自动重试后,是否将任务重新入queue后排队,还是等待指定的时间?可以通过self.retry()参数来指定。
- 派发到不同Queue队列的task
- 一个task自动映射到多个queue中的方法, 通过配置task和queue的routing_key命名模式。
- 比如:把queue的exchange和routing_key配置成通用模式:
- 再定义task的routing_key的名称:
- 可用的不同exchange策略:
- direct:直接根据定义routing_key
- topic:exchange会根据通配符来将一个消息推送到多个queue。
- fanout:将消息拆分,分别推送到不同queue,通常用于超大任务,耗时任务。
- 参考:http://celery.readthedocs.org/en/latest/userguide/routing.html#routers
- 一个task自动映射到多个queue中的方法, 通过配置task和queue的routing_key命名模式。
- 高级配置
- result是否保存
- 失败邮件通知:
- 关闭rate limit:
- auto_reload方法(*nix系统):
- celery通过监控源代码目录的改动,自动地进行reload
- 使用方法:1.依赖inotify(Linux) 2. kqueue(OS X / BSD)
- 安装依赖:
$ pip install pyinotify
- (可选) 指定fsNotify的依赖:
$ env CELERYD_FSNOTIFY=stat celery worker -l info --autoreload
- 启动: celery -A appname worker --autoreload
- auto-scale方法:
- 启用auto-scale
- 临时增加worker进程数量(增加consumer):
$ celery -A proj control add_consumer foo -d worker1.local
- 临时减少worker进程数量(减少consumer):
- 将scheduled task的配置从app.conf变成DB的方法:
- 需要在启动时指定custom schedule 类名,比如默认的是: celery.beat.PersistentScheduler 。
- celery -A proj beat -S djcelery.schedulers.DatabaseScheduler
- 需要在启动时指定custom schedule 类名,比如默认的是: celery.beat.PersistentScheduler 。
- 启动停止worker的方法:
- 启动 as daemon : http://docs.celeryproject.org/en/latest/tutorials/daemonizing.html#daemonizing
- root用户可以使用celeryd
- 非特权用户:celery multi start worker1 -A appName —autoreload --pidfile="HOME/run/celery/HOME/run/celery/HOME/log/celery/%n.log"
- 或者 celery worker —detach
- 停止
- ps auxww | grep 'celery worker' | awk '{print $2}' | xargs kill -9
- 启动 as daemon : http://docs.celeryproject.org/en/latest/tutorials/daemonizing.html#daemonizing
- 与Flask集成的方法
- 集成后flask将充当producer来创建并发送task给broker,在celery启动的独立worker进程将从broker中获得task并执行,同时将结果返回。
- flask中异步地获得task结果的方法:add.delay(x,y),有时需要对参数进行命名后传递 或者 add.apply_async(args=(x,y), countdown=30)
- flask获得
- 与flask集成后的启动问题
- 由于celery的默认routing_key是根据生产者在代码中的import级别来设定的,所以worker端在启动时应该注意其启动目录应该在项目顶级目录上,否者会出现KeyError。
- 性能提升: eventlet 和 greenlet
Celery的实践指南的更多相关文章
- [CoreOS 转载] CoreOS实践指南(七):Docker容器管理服务
转载:http://www.csdn.net/article/2015-02-11/2823925 摘要:当Docker还名不见经传的时候,CoreOS创始人Alex就预见了这个项目的价值,并将其做为 ...
- [CoreOS 转载] CoreOS实践指南(五):分布式数据存储Etcd(上)
转载:http://www.csdn.net/article/2015-01-22/2823659 摘要:在“漫步云端:CoreOS实践指南”系列的前几篇,分别介绍了如何架设CoreOS集群,系统服务 ...
- [CoreOS 转载] CoreOS实践指南(四):集群的指挥所Fleet
转载:http://www.csdn.net/article/2015-01-14/2823554/2 摘要:CoreOS是采用了高度精简的系统内核及外围定制的操作系统.ThoughtWorks的软件 ...
- OpenGL ES应用开发实践指南:iOS卷
<OpenGL ES应用开发实践指南:iOS卷> 基本信息 原书名:Learning OpenGL ES for iOS:A Hands-On Guide to Modern 3D Gra ...
- 《赢在用户:Web人物角色创建和应用实践指南》阅读总结
本书针对创建人物角色的每一个步骤,包括进行定性.定量的用户研究,生成人物角色分类,使人物角色真实可信等进行了十分详细的介绍.而且,在人物角色如何指导总体商业策略.确定信息架构.内容和设计 ...
- lua游戏开发实践指南学习笔记1
本文是依据lua游戏开发实践指南做的一些学习笔记,仅用于继续自己学习的一些知识. Lua基础 1. 语言定义: 在lua语言中,标识符有非常大的灵活性(变量和函数名),只是用户不呢个以数字作为起始符 ...
- 《App架构实践指南》
推荐书籍 <App 架构实践指南>
- Python 最佳实践指南 2018 学习笔记
基础信息 版本 Python 2.7 Python 3.x Python2.7 版本在 2020 年后不再提供支持,建议新手使用 3.x 版本进行学习 实现 CPython:Python的标准实现: ...
- DevOps知识地图实践指南
DevOps知识地图 DevOps方法论的主要来源是Agile, Lean 和TOC, 独创的方法论是持续交付. DevOps经典图书: * <DevOps实践指南> * <持续 ...
随机推荐
- Tomcat 日志清除(含扩展AccessLogValve)
1.tomcat的访问日志AccessLogs定期或者定量删除 a 开启tomcat访问日志 编辑${catalina}/conf/server.xml文件.注:${catalina}是tomcat的 ...
- ArcGIS Engine开发之地图文档保存
在对地图文档进行修改后,经常需要对其进行保存.地图文档的保存有直接保存和另存为两种方式.这里的地图文档的修改指的是修改地图文档文件记录信息,不是对空间数据的编辑. 1.地图文档保存 具体实现的思路: ...
- react-native-vector-icons的简单使用,图片,按钮,标签视图,导航条
ICONS是可以直接使用图片名, 就能加载图片的三方,使用很方便, 你不需要在工程文件夹里塞各种图片, 节省很多空间,下面就来看看怎么使用吧! 1. 首先打开terminal进入到我们的工程文件夹下, ...
- kindle型号
这篇文章为 Kindle 新手解决三个问题:怎么辨别Kindle 型号?通过 Kindle 外观判断准确吗?Kindle序列号在那里? 贴吧吧友提问的原话"在咸鱼看到一台,那哥们说也不知道K ...
- RecyclerView如何消除底部的分割线
最近遇到一个问题,用RecyclerView显示数据,纵向列表显示,添加默认分割线. 问题是:底部也会显示分割线,这很影响美观. 怎么解决这个问题呢?我想了很多办法,毫无头绪... 最后, ...
- Jsp的九个内置对象
一.什么是内置对象?在jsp开发中,会频繁使用到一些对象.例如HttSession,ServletContext,HttpServletRequest.如果我们每次要使用这些对象都去创建这些对象,就会 ...
- ASP.NET MVC 3 网站优化总结(六)压缩 HTML
压缩 html 可以去除代码中无用的空格等,这样可提高网站的加载速度并节省带宽.今天就让我们看看在 ASP.NET MVC 3 怎么实现 html 压缩,我们可通过实现 ActionFilter 来完 ...
- JavaScript 事件
事件 概念:事件是可以被 JavaScript 侦测到的行为. JavaScript 使我们有能力创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触 ...
- 项目自动化建构工具gradle 入门0——环境 & 废话
gradle 是一个项目自动化构建工具.同类的产品还有ant ,maven等等.相比之下我更喜欢gradle,它语法简洁.兼容maven.ide集成很好. 学习使用gradle最快的方式是看文档,而且 ...
- [LeetCode] Single Number III 单独的数字之三
Given an array of numbers nums, in which exactly two elements appear only once and all the other ele ...