celery使用的一些小坑和技巧(非从无到有的过程)
纯粹是记录一下自己在刚开始使用的时候遇到的一些坑,以及自己是怎样通过配合redis来解决问题的。
文章分为三个部分,一是怎样跑起来,并且怎样监控相关的队列和任务;二是遇到的几个坑;三是给一些自己配合redis使用的代码示例。
一.celery使用:
Ⅰ.把任务中间件服务器跑起来,rabbitmq-server
跑起来以后,就能在浏览器(http://localhost:15672/#/queues)里面看中间件里面的相关内容了。
(如果想把这边的某些队列下面的没有跑完的任务丢弃掉的话,进对应的队列,点击delete)
Ⅱ.在终端里面对应路径下面把celery的任务队列跑起来:
eg:celery -A celery_autowork_task worker --loglevel=info -Q auto_work
注意里面的各个参数的意义
Ⅲ.看具体的每个任务的执行情况,是否成功之类的
1.安装flower,pip3 install flower
2.用celery把flower跑起来celery flower
3.http://localhost:5555在这个链接,或者终端里面看见的就能看具体的每个任务的执行情况
二.坑:
Ⅰ.异常场景:并发数设置成4,然后第一次进去队列的时候是用的第一个,retry的时候,居然在4和2里面都触发了任务。也就是关了一个,开了两个。
异常原因:在exception的代码段里面加了retry功能, 然后在try的代码段里面也加了try功能,但是查看retry函数本身的定义,发现它的类型就是exception;也就是调用这个本身就是一个异常会走到处理异常的代码段里面去;所以更好的方式是只在exception的代码段里面retry,然后如果try里面需要retry的话,直接用raise 搞一个异常出来;
Ⅱ.异常场景:在task装饰器里面定义重试间隔时间default_retry_delay,或者在retry里面指定countdown为5秒,但是在终端里面看见的一个任务的两次开始执行时间发现都会大于5秒。开始还以为是不是两个设置会互相影响。
异常原因:后来发现的default_retry_dalay是在retry的时候没有传参数的的默认重试间隔时间,可以看模块代码http://docs.celeryproject.org/en/latest/_modules/celery/app/task.html?highlight=task;但之所以一个任务的两次开始执行时间大于5秒是因为,我们的retry一般都写在exception的代码块里面,而这个间隔时间,其实指的是,执行到retry的时间往后推5秒。try里面的操作会有耗时,所以导致了两次任务的开始时间大于5秒。那么如果想要两次的开始时间为5秒的话,可以在进入任务的时候进行一下计时,然后任务重试的时候看整个try的代码块的耗时。
Ⅲ.异常场景:在task装饰器里面提供了max_retries最大重试次数,然后到达最大重试次数(比如10次)以后,在第十次的重试里面仍然会走到retry方法,这个时候,居然在终端开间异常抛出了。
异常原因:按我的个人理解,这种设定了10次重试次数,但是在第十次开启第11次的重试时候,应该模块是自动不让重试才对的。可是貌似没有完成,或者可能是我没有搜索到正确的使用方法;解决办法就是自己在重试之前看当前的重试次数,自己控制
Ⅳ.异常场景:如果一次任务在第一次的发起,重试次数还没到的时候想要第二次发起怎么办?就是一般来说还是只允许一个实际任务只有一个队列里面的任务处理它
处理办法:不管是delay还是apply_async方法都是有返回值的,这个返回值的是celery里面的一个类,可以string以后得到任务的ID,然后之后用app.control里面的revoke方法把对应的任务中断掉。可以查看对应模块的源代码http://docs.celeryproject.org/en/latest/_modules/celery/app/control.html
三.代码示例
celery_autowork_task.py【任务执行方法的定义的地方】
from celery import Celery
AutoWork = Celery('auto_work', broker = 【CELERY_BROKER】, backend = '')
AutoWork.conf.CELERY_TIMEZONE = 'Asia/Shanghai' # 时区
AutoWork.conf.CELERYD_CONCURRENCY = 4 # 任务并发数
AutoWork.conf.CELERYD_TASK_SOFT_TIME_LIMIT = 300 # 任务超时时间
AutoWork.conf.CELERY_DISABLE_RATE_LIMITS = True # 任务频率限制开关 AutoWork.conf.CELERY_ROUTES = { # 任务调度队列
"autowork_check_barcode_recharge":{"queue":"auto_work"},
} @AutoWork.task(bind=True,name="autowork_check_barcode_recharge",max_retries=15)
def autowork_check_barcode_recharge(self,recharge_id):
time_begin=datetime.datetime.now()
try:
pass
except Exception as exc:
retries=self.request.retries
if retries<self.max_retries:
delta_second=(datetime.datetime.now()-time_begin).seconds
if delta_second<5:
return self.retry(exc = exc,countdown=5-delta_second)
else:
return self.retry(exc = exc,countdown=0)
finally:
pass
test.py【调用任务以及检查任务的执行情况】
def cancel_pre_celery_task_and_excute_next_task(self,recharge_record):
recharge_work_guid="recharge_work_guid:%d:%s"%(recharge_record.shop_id,recharge_record.num)
from handlers.celery_autowork_task import autowork_check_barcode_recharge
if redis.get(recharge_work_guid): #上次是否有执行这个实际业务中的任务
from celery_autowork_task import AutoWork
AutoWork.control.revoke(redis.get(recharge_work_guid).decode('utf-8'),terminate=True) #如果有执行,则中断
autowork_guid=autowork_check_barcode_recharge.delay(recharge_record.id) #得到本次的任务GUID
redis.set(recharge_work_guid,str(autowork_guid)) #保存到redis里面去
redis.expire(recharge_work_guid,3600)
celery使用的一些小坑和技巧(非从无到有的过程)的更多相关文章
- AngularJs遇到的小坑与技巧
1. templateURL和路由之类的要在web server下运行. 2. 使用模板replace设为true,模板里也要有相应的标签,否则不出现任何数据. 3. 1.2版本之后,ngRoute模 ...
- JavaScript的兼容小坑和调试小技巧
JavaScript作为一种弱类型编程语言,入门简单,只要稍微注意一下IE方面的兼容性,就可以很好的使用它. 本文主要是对IE兼容的小坑和调试的小技巧进行举例分析,并给出解决方法. 1.var str ...
- Excel催化剂开源第13波-VSTO开发之DataGridView控件几个小坑
Excel催化剂内部大量使用了DataGridView,这其中有一些小坑,花了力气才解决的,在此给广大开发者作简单分享. 为何要使用DataGridView而不是其他控件如ListBox.ListVi ...
- 15. Go 语言“避坑”与技巧
Go 语言"避坑"与技巧 任何编程语言都不是完美的,Go 语言也是如此.Go 语言的某些特性在使用时如果不注意,也会造成一些错误,我们习惯上将这些造成错误的设计称为"坑& ...
- mciSendString 的两个小坑
刚刚修正了自己用的小闹钟的代码. 坑1:REPEAT 选项的作用范围 原来用得好好的,之后选择 .wav 文件,居然不出声音了…… 诶,MCI 肯定支持 .wav 的啊…… 仔细想想,我以前都是选 . ...
- 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式
注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...
- C#中的Infinity有个小坑
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天家里有事,上网也不方便,就没有推送文章.今天很累,也不长篇大论了.简单介绍一下最近遇到的 ...
- 使用EMMET中的小坑
使用EMMET写HTML的时候,是一个非常爽的事情.但是今天我使用时,发现一个小坑.以前倒也没有注意,不过需要非常的小心. form[action="/process" metho ...
- 几个 jQuery 小提示和技巧
几个 jQuery 小提示和技巧 今天,我们将分享一些很有用的技巧和窍门给 jQuery 开发人员.jQuery 是最好的 JavaScript 库之一,用于简化动画,事件处理,支持 Ajax 和 H ...
随机推荐
- Angular2入门系列教程2-项目初体验-编写自己的第一个组件
上一篇 使用Angular-cli搭建Angular2开发环境 Angular2采用组件的编写模式,或者说,Angular2必须使用组件编写,没有组件,你甚至不能将Angular2项目启动起来 紧接着 ...
- 前端学Markdown
前面的话 我个人理解,Markdown就是一个富文本编辑器语言,类似于sass对于css的功能,Markdown也可以叫做HTML预处理器,只不过它是一门轻量级的标记语言,可以更简单的实现HTML ...
- 【NLP】揭秘马尔可夫模型神秘面纱系列文章(一)
初识马尔可夫和马尔可夫链 作者:白宁超 2016年7月10日20:34:20 摘要:最早接触马尔可夫模型的定义源于吴军先生<数学之美>一书,起初觉得深奥难懂且无什么用场.直到学习自然语言处 ...
- 编写自己的PHP MVC框架笔记
1.MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). ...
- arcgis api for js入门开发系列四地图查询(含源代码)
备注:由于实现本篇功能的需求,修改了地图数据的dlsearch.mxd,然后更新了地图服务,需要的在文章最后有提供最新的mxd以及源代码下载的 上一篇实现了demo的地图工具栏,本篇新增地图查询功能, ...
- CRM 数据密钥 忘记 解决方案
UPDATE EmailServerProfile SET IncomingPassword=nullUPDATE EmailServerProfile SET OutgoingPassword=nu ...
- Quartz2D总结
天了噜,脑子完全懵了,最起码说出来个上下文啊,连这个都给忘了,特此总结一下,并以此缅怀这次面试 Quartz2D的API来自于Core Graphics(这就是为什么CGContextRef是以CG开 ...
- React Native环境配置之Windows版本搭建
接近年底了,回想这一年都做了啥,学习了啥,然后突然发现,这一年买了不少书,看是看了,就没有完整看完的.悲催. 然后,最近项目也不是很紧了,所以抽空学习了H5.自学啃书还是很无趣的,虽然Head Fir ...
- 【C#】获取网页内容及HTML解析器HtmlAgilityPack的使用
最近经常需要下载一些东西,而这个下载地址又会经过层层跳转,每个页面上都有很多广告,烦不胜烦,所以做了一个一键获得最终下载地址的小工具.使用C#,来获取网页内容,然后通过HtmlAgilityPack获 ...
- Yeoman 学习笔记
yoeman 简介:http://www.infoq.com/cn/news/2012/09/yeoman yeoman 官网: http://yeoman.io/ yeoman 是快速创建骨架应用程 ...