python使用异步任务celery出现异常崩溃时retry重试

前言:

python下的celery是啥东西大家应该有了解,是一个异步的任务框架 。话说,  我以前写过一个报警平台的项目,也需要任务的扩展成分布式,当时总是觉得 用celery不是那么太靠谱,所以就自己写了一个分布式的任务派发的系统。

今个和朋友聊起了分布式爬虫,这哥们说 任务有时候经常的崩溃,但是celery的retry的机制有些意思,最后看了下文档  ,又研究了下retry的参数,然后把自己的一些实战分享给大家。

#xiaorui.cc
@celery.task(bind=True,max_retries=3,default_retry_delay=1 * 6)
def sum(self, num):
    try:
        f = open(‘plog‘,‘a‘)
        f.write(‘retry\n‘)
        f.close()
        num = num + 1
        return num
    except Exception as exc:
        raise self.retry(exc=exc, countdown=60)

其实最主要就那几个参数,官网写的也很干练,上来就给个例子。  呵呵 ~

bind=True 是开启

max_retries 是重新尝试的此时

default_retry_delay 是默认的间隔时间,尝试的时间

下面的代码,大家应该懂的。  就是捕捉异常。

countdown 也是时间,这个时间优先级是大于上面的default_retry_delay的。

这个时候我是可以看到,我刚才设置的,碰到异常之后,重新执行三遍的。

注意下,这个异常是我自己特意抛出去的,不懂的看上面的py。  还有一点是celery 自己会sleep 时间。  我定义了60s 。

然后咱们在测试下,重启celery,任务肯定是正常运行的,毕竟是放在队列里面的。启动celery的时候,他也只是从队列里面取任务。 我写入celery的时候,只要保证后端的队列没挂掉就可以了。

redis 127.0.0.1:6379> lrange celery 0 -1
1) "{\"body\": \"gAJ9cQEoVQdleHBpcmVzcQJOVQN1dGNxA4hVBGFyZ3NxBFUEaXAgYXEFhXEGVQVjaG9yZHEHTlUJY2FsbGJhY2tzcQhOVQhlcnJiYWNrc3EJTlUHdGFza3NldHEKTlUCaWRxC1UkYTZkMTJkZTMtYjUzOC00ZjMxLWFiNzMtNjExNTQwYjY5NmZkcQxVB3JldHJpZXNxDUsDVQR0YXNrcQ5VCXRhc2tzLnN1bXEPVQl0aW1lbGltaXRxEE5OhnERVQNldGFxElUgMjAxNC0wOS0wMlQxMjoxMjozOC4wNDE4OTYrMDA6MDBxE1UGa3dhcmdzcRR9cRV1Lg==\", \"headers\": {\"redelivered\": true}, \"content-type\": \"application/x-python-serialize\", \"properties\": {\"body_encoding\": \"base64\", \"delivery_info\": {\"priority\": 0, \"routing_key\": \"celery\", \"exchange\": \"celery\"}, \"delivery_mode\": 2, \"correlation_id\": \"a6d12de3-b538-4f31-ab73-611540b696fd\", \"reply_to\": \"4459d9e6-2cff-35c9-be5b-45a2d976911e\", \"delivery_tag\": \"bd4480dd-d04a-4401-876b-831b30b55f4e\"}, \"content-encoding\": \"binary\"}"
2) "{\"body\": \"gAJ9cQEoVQdleHBpcmVzcQJOVQN1dGNxA4hVBGFyZ3NxBFUEaXAgYXEFhXEGVQVjaG9yZHEHTlUJY2FsbGJhY2tzcQhOVQhlcnJiYWNrc3EJTlUHdGFza3NldHEKTlUCaWRxC1UkNDczMzFhYTgtNzZhOC00N2E1LTg1MGItNzZkYTY0YjY2YzM1cQxVB3JldHJpZXNxDUsBVQR0YXNrcQ5VCXRhc2tzLnN1bXEPVQl0aW1lbGltaXRxEE5OhnERVQNldGFxElUgMjAxNC0wOS0wMlQxMjoxMjo1NS40NjA0MzArMDA6MDBxE1UGa3dhcmdzcRR9cRV1Lg==\", \"headers\": {\"redelivered\": true}, \"content-type\": \"application/x-python-serialize\", \"properties\": {\"body_encoding\": \"base64\", \"delivery_info\": {\"priority\": 0, \"routing_key\": \"celery\", \"exchange\": \"celery\"}, \"delivery_mode\": 2, \"correlation_id\": \"47331aa8-76a8-47a5-850b-76da64b66c35\", \"reply_to\": \"4459d9e6-2cff-35c9-be5b-45a2d976911e\", \"delivery_tag\": \"9fa3c120-0bfd-4453-9539-1465e6e820ff\"}, \"content-encoding\": \"binary\"}"
redis 127.0.0.1:6379>

其实我更关注的是崩溃的处理,比如 我们的celery已经做了分布式扩展了。 当一个node已经去到任务,但是突然oom了,sx了。 我原本以为celery 借助rabbotmq的ack机制,来处理这样的情况,但是我的测试结果告诉我,celery的retry机制,只是限于本地玩耍。  其实我们就算不用他的retry装饰器,也可以自己写个for循环,然后过滤下异常罢了。

我现在的做法是,每次获取到任务,做事情之前,先要回调一个接口,然后把我要做的事情push过去,然后把做个标示位,说自己正在干,如果10分钟之后,还没有把你删掉的话,你就再塞入队列中。

当然方法还是有些挫,但是已经线上跑了一段时间,没什么大问题,只是在任务太多的情况下,监控任务的线程貌似多到崩溃。 后期可以改用gevent pool的方式来进行轮训监控事件是否完成。

如果你是那种平台性质的任务发布,在页面上长时间是loading....的状态,你容易做出分析的。

但大家没这么倒霉的~  只要异常处理的好。

个人还是自己开发的靠谱点。 celery可能是太强大了,忽略了一些地方。

时间: 2024-08-01 10:46:35

python使用异步任务celery出现异常崩溃时retry重试的相关文章

android在程序崩溃时Catch异常并处理

Android系统的"程序异常退出",给应用的用户体验造成不良影响.为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理.通过Thread.setDefaultUncaughtExceptionHandler()方法将异常处理类设置到线程上即可. 写一个例子来理解. 1.新建项目,新建一个MyCatchException类,实现uncaughtExceptionHandler. //全部错误捕捉器 public class MyCatc

Python学习笔记 - day14 - Celery异步任务

Celery概述 关于celery的定义,首先来看官方网站: Celery(芹菜) 是一个简单.灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具. 简单来看,是一个基于python开发的分布式异步消息任务队列,持使用任务队列的方式在分布的机器.进程.线程上执行任务调度.通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景中可用的例子: 你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的

Python语法速查: 10. 异常

返回目录 本篇索引 (1)内置异常 (2)自定义异常 (3)主动引发异常 (4)捕捉异常 (5)error模块 (6)with语句 (1)内置异常 ● 异常的基类: 以下这些异常作为具体异常的基类,都不会被显式引发,但是可以使用它们捕捉某种错误. 基类名称 说明 BaseException 所有内置异常的基类,其他所有内置异常都派生自该类.   Exception 所有内置的非系统退出异常都派生自此类(即除了:SystemExit, GeneratorExit, KeyboardInterrup

Python 开源异步并发框架的未来(转)

Python 开源异步并发框架的未来 fantix 1.1k 2014年04月16日 发布 推荐 4 推荐 收藏 31 收藏,8.9k 浏览 呵呵,这个标题有点大,其实只是想从零开始介绍一下异步的基础,以及 Python 开源异步并发框架的发展和互操作性. 另外,这是我在 OSTC 2014 做的一个 20140330-OSTC-分论坛1王川 http://v.youku.com/v_show/id_XNjk2ODI0ODQ4.html ,幻灯片在这里,欢迎拍砖. 开源 Python 是开源的,

Python 并行分布式框架 Celery

Celery 简介 除了redis,还可以使用另外一个神器---Celery.Celery是一个异步任务的调度工具. Celery 是 Distributed Task Queue,分布式任务队列,分布式决定了可以有多个 worker 的存在,队列表示其是异步操作,即存在一个产生任务提出需求的工头,和一群等着被分配工作的码农. 在 Python 中定义 Celery 的时候,我们要引入 Broker,中文翻译过来就是"中间人"的意思,在这里 Broker 起到一个中间人的角色.在工头提

【转】Python 并行分布式框架 Celery

原文链接:https://blog.csdn.net/freeking101/article/details/74707619 Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryproject.org/en/latest/index.html Celery 官方文档中文版:http://docs.jinkan.org/docs/celery/ celery配置:http://docs.jinkan.o

python进阶八_警告和异常

心情有点纠结,怎么说呢,倒不是因为其他学习上的事情,反而是因为生活上狗血的剧情逼着人偏离,渐行渐远,人跟人之间有误会也是正常的,可能是因为交流不够,彼此不够了解吧,希望能尽快度过这一段纠结的日子,简单的生活,慢慢的品味,细细的思考. 最近一段时间,因为需要,借阅了一本Python Cookbook,发现这本书在很多方面介绍的都很不错,比如一些系统管理,web,分布式编程,数据持久化等等这些方面.但是却没有发现详细的关于错误和异常的一些介绍,本着作死的态度打算好好研究一下. 首先,照例,我们先来看

Python开源异步并发框架

Python开源异步并发框架的未来 2014年3月30日,由全球最大的中文IT社区CSDN主办的“开源技术大会·2014” (Open Source Technology Conference 2014,简称OSTC 2014)在北京丽亭华苑酒店召开. 本次大会以“启蒙·开源”(Open Mind, Open Source)为主题,邀请到了来自全国各地的30多位开源业界资深人士发表主题演讲,数十个开源社区现场参与,到场的开源软件开发者.贡献者和开源爱好 者总人数超过500人.作为一场“接地气”的

Android开发:StaggeredGridView瀑布流控件运行异常崩溃解决方法

StaggeredGridView是github上一个开源的瀑布流图片库,本文将分享集成StaggeredGridView时碰到的异常以及解决方法,StaggeredGriedView开源地址为:https://github.com/maurycyw/StaggeredGridView. StaggeredGriedViewDemo运行报错异常为: java.lang.RuntimeException: Unable to start activity  ComponentInfo{com.ex