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 ...
随机推荐
- Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作
一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...
- angular实现统一的消息服务
后台API返回的消息怎么显示更优雅,怎么处理才更简洁?看看这个效果怎么样? 自定义指令和服务实现 自定义指令和服务实现消息自动显示在页面的顶部,3秒之后消失 1. 显示消息 这种显示消息的方式是不是有 ...
- Node-Webkit打包
1.node-webkit是什么? NW.js is an app runtime based on Chromium and node.js. You can write native apps i ...
- jQuery学习之路(4)- 动画
▓▓▓▓▓▓ 大致介绍 通过jQuery中基本的动画方法,能够轻松地为网页添加非常精彩的视觉效果,给用户一种全新的体验 ▓▓▓▓▓▓ jQuery中的动画 ▓▓▓▓▓▓ show()和hide()方法 ...
- ASP.NET Core: You must add a reference to assembly mscorlib, version=4.0.0.0
ASP.NET Core 引用外部程序包的时候,有时会出现下面的错误: The type 'Object' is defined in an assembly that is not referenc ...
- submit text3常用快捷键
在网上找了一些submit text的快捷键: Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选择需要合并的 ...
- 破解SQLServer for Linux预览版的3.5GB内存限制 (RHEL篇)
微软发布了SQLServer for Linux,但是安装竟然需要3.5GB内存,这让大部分云主机用户都没办法尝试这个新东西 这篇我将讲解如何破解这个内存限制 要看关键的可以直接跳到第6步,只需要替换 ...
- 在Windows上编译和调试CoreCLR
生成CoreCLR - Windows篇 本文的唯一目的就是让你运行Hello World 运行环境 Window 7+ Visual studio 2015 确保C++ 工具已经被安装,默认是不安装 ...
- PHP之Memcache缓存详解
Mem:memory缩写(内存):内存缓存 1. 断电或者重启服务器内存数据即消失,即临时数据: Memcache默认端口:11211 存入方式:key=>>value ...
- Hadoop 2.x 生态系统及技术架构图
一.负责收集数据的工具:Sqoop(关系型数据导入Hadoop)Flume(日志数据导入Hadoop,支持数据源广泛)Kafka(支持数据源有限,但吞吐大) 二.负责存储数据的工具:HBaseMong ...