纯粹是记录一下自己在刚开始使用的时候遇到的一些坑,以及自己是怎样通过配合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. C语言 · 查找整数 · 基础练习

    问题描述 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个. 输入格式 第一行包含一个整数n. 第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000. 第三行包含一个 ...

  2. MVC Core 网站开发(Ninesky) 2.1、栏目的前台显示

    上次创建了栏目模型,这次主要做栏目的前台显示.涉及到数据存储层.业务逻辑层和Web层.用到了迁移,更新数据库和注入的一些内容. 一.添加数据存储层 1.添加Ninesky.DataLibrary(与上 ...

  3. [C#] C# 知识回顾 - 序列化

    C# 知识回顾 -  序列化 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902005.html 目录 序列化的含义 通过序列化保存对象数据 众 ...

  4. CSS——关于z-index及层叠上下文(stacking context)

    以下内容根据CSS规范翻译. z-index 'z-index'Value: auto | <integer> | inheritInitial: autoApplies to: posi ...

  5. python 数据类型 -- 元组

    元组其实是一种只读列表, 不能增,改, 只可以查询 对于不可变的信息将使用元组:例如数据连接配置 元组的两个方法: index, count >>> r = (1,1,2,3) &g ...

  6. 子类继承父类时JVM报出Error:Implicit super constructor People() is undefined for default constructor. Must define an explicit constructor

    当子类继承父类的时候,若父类没有定义带参的构造方法,则子类可以继承父类的默认构造方法 当父类中定义了带参的构造方法,子类必须显式的调用父类的构造方法 若此时,子类还想调用父类的默认构造方法,必须在父类 ...

  7. 关于CSS inline-block、BFC以及外边距合并的几个小问题

    CSS inline-block和BCF对于初学者来说,总是弄不太明白,下面记录下我在学习这块知识的过程中遇到的几个问题,供大家参考,有不足的地方,欢迎大家批评指正. 一.在什么场景下会出现外边距合并 ...

  8. 15个C++项目列表

    实验楼上有很多C++的实战项目,从简单到进阶,学习每个项目都可以掌握相应的知识点. 如果你还是C++新手的话,那么这个C++的项目列表你可以拿去练手实战开发,毕竟学编程动手实践是少不了的! 如果你不知 ...

  9. PMON failed to acquire latch, see PMON dump

    前几天,一台Oracle数据库(Oracle Database 10g Release 10.2.0.4.0 - 64bit Production)监控出现"PMON failed to a ...

  10. 使用nginx反向代理,一个80端口下,配置多个微信项目

    我们要接入微信公众号平台开发,需要填写服务器配置,然后依据接口文档才能实现业务逻辑.但是微信公众号接口只支持80接口(80端口).我们因业务需求需要在一个公众号域名下面,发布两个需要微信授权的项目,怎 ...