纯粹是记录一下自己在刚开始使用的时候遇到的一些坑,以及自己是怎样通过配合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使用的一些小坑和技巧(非从无到有的过程)的更多相关文章

  1. AngularJs遇到的小坑与技巧

    1. templateURL和路由之类的要在web server下运行. 2. 使用模板replace设为true,模板里也要有相应的标签,否则不出现任何数据. 3. 1.2版本之后,ngRoute模 ...

  2. JavaScript的兼容小坑和调试小技巧

    JavaScript作为一种弱类型编程语言,入门简单,只要稍微注意一下IE方面的兼容性,就可以很好的使用它. 本文主要是对IE兼容的小坑和调试的小技巧进行举例分析,并给出解决方法. 1.var str ...

  3. Excel催化剂开源第13波-VSTO开发之DataGridView控件几个小坑

    Excel催化剂内部大量使用了DataGridView,这其中有一些小坑,花了力气才解决的,在此给广大开发者作简单分享. 为何要使用DataGridView而不是其他控件如ListBox.ListVi ...

  4. 15. Go 语言“避坑”与技巧

    Go 语言"避坑"与技巧 任何编程语言都不是完美的,Go 语言也是如此.Go 语言的某些特性在使用时如果不注意,也会造成一些错误,我们习惯上将这些造成错误的设计称为"坑& ...

  5. mciSendString 的两个小坑

    刚刚修正了自己用的小闹钟的代码. 坑1:REPEAT 选项的作用范围 原来用得好好的,之后选择 .wav 文件,居然不出声音了…… 诶,MCI 肯定支持 .wav 的啊…… 仔细想想,我以前都是选 . ...

  6. 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式

    注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...

  7. C#中的Infinity有个小坑

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天家里有事,上网也不方便,就没有推送文章.今天很累,也不长篇大论了.简单介绍一下最近遇到的 ...

  8. 使用EMMET中的小坑

    使用EMMET写HTML的时候,是一个非常爽的事情.但是今天我使用时,发现一个小坑.以前倒也没有注意,不过需要非常的小心. form[action="/process" metho ...

  9. 几个 jQuery 小提示和技巧

    几个 jQuery 小提示和技巧 今天,我们将分享一些很有用的技巧和窍门给 jQuery 开发人员.jQuery 是最好的 JavaScript 库之一,用于简化动画,事件处理,支持 Ajax 和 H ...

随机推荐

  1. .NET Core系列 :3 、使用多个项目

    通过前面的两篇文章,我们已经知道如何创建新的项目,如何生成并运行我们的应用程序,也知道(大致) project.json 文件中的内容是什么意思.但大多数项目往往也需要多个项目或引用的类库.我们要创建 ...

  2. 微软.NET Core RC2正式发布,横跨所有平台

    .NET官方博客宣布了<Announcing .NET Core RC2 and .NET Core SDK Preview 1>,正式如期发布了.NET Core RC2, 现在可以放心 ...

  3. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  4. Xshell 连接CentOS服务器解密

    平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html Xshell生成密钥key(用于Linux 免密码登录)htt ...

  5. 46张PPT讲述JVM体系结构、GC算法和调优

    本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...

  6. .NET平台开源项目速览(17)FluentConsole让你的控制台酷起来

    从该系列的第一篇文章 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 开始,不知不觉已经到第17篇了.每一次我们都是介绍一个小巧甚至微不足道的.NET平台的开源软件,或者学习,或 ...

  7. 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库

    57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...

  8. Mac上MySQL忘记root密码且没有权限的处理办法&workbench的一些tips (转)

    忘记Root密码肿么办 Mac上安装MySQL就不多说了,去mysql的官网上下载最新的mysql包以及workbench,先安装哪个影响都不大.如果你是第一次安装,在mysql安装完成之后,会弹出来 ...

  9. iOS:以前笔记,未整理版。太多了,先放着吧。。。。。。。

    1. -(void)timetick { _d = 0; NSTimer *newtime =[NSTimer scheduledTimerWithTimeInterval:1 target:self ...

  10. v14.0\AspNet\Microsoft.Web.AspNet.Props 找不到

    错误 E:\Github\AutoMapper\src\AutoMapper\AutoMapper.CoreCLR.kproj : error  : 未找到导入的项目"C:\Program ...