最近在做celery task方面的工作,发现其中坑还是挺多的。 一个就是处理复杂耗时task时对timelimit的配置。 celery 中 time limit 有两种, soft_time_limit 和 time_limit, 区别是 soft_time_limit 会在内部抛一个 Exception, task 可以 通过try...except 自行处理,time_limit则是中断woker重启没法被catch做一些...
Task.rate_limit:设置任务类型的速度限制 Task.time_limit:此任务的硬限时,单位为秒 Task.serializer:标识要使用的默认序列化方法的字符串 修改task1.py的内容如下 fromappsimportappimportcelery celery.Task#Task的属性在这里面classBaseTask(celery.Task):defon_failure(self, exc, task_id, args, kwargs, einf...
# 显示任务结果'django_celery_beat',# 设置定时或周期性任务'taskApp',# 注册 taskApp'import_export',# django admin 后台进行数据导入导出]LANGUAGE_CODE='zh-hans'TIME_ZONE='Asia/Shanghai'USE_I18N=TrueUSE_L10N=TrueUSE_TZ=False# 最重要的配置,设置消息broker,格式为:db://user:password@host:port/...
importtimefromtaskimporttask# 导入task, 创建任务# 但是注意: 不要直接调用task, 因为那样的话就在本地执行了# 我们的目的是将任务发送到队列里面去, 然后让监听队列的worker从队列里面取任务并执行# 而task是被@app.task装饰了, 所以它不在是原来的task了, 我们需要调用它的delay方法# 调用delay之后, 就会创...
Task.throws:预期错误类的可选元组,不应被视为实际错误,而是结果失败; Task.rate_limit:设置此任务类型的速率限制 Task.time_limit:此任务的硬限时(以秒为单位)。 Task.ignore_result:不存储任务状态。默认False; Task.store_errors_even_if_ignored:如果True,即使任务配置为忽略结果,也会存储错误。
CELERY_TASK_TIME_LIMIT: 单个任务运行的时间限制,超时会被杀死,不建议使用该参数,而用CELERY_TASK_SOFT_TIME_LIMIT CELERY_RESULT_TACKEND: 使用redis存储执行结果 CELERY_TASK_SERIALIZER: 任务序列化方式 CELERY_RESULT_SERIALIZER: 任务执行结果序列化方式 ...
软超时(soft_time_limit) @celery.task(soft_time_limit=360) def soft_time_out_try(args,url_array): pass 在这种情况下,就算超时了,也是平滑过渡不会报错,推荐优先考虑。 但是这种情况有个问题,在该机制下,如果函数中含有容易超时的第三方模块,是可能存在软超时以后,任务继续卡住的情况的。 笔者在测试时...
CELERY_TASK_RESULT_EXPIRES = 1200 单个任务的运行时间限制,否则会被杀死 CELERYD_TASK_TIME_LIMIT = 60 使用redis存储任务执行结果,默认不使用 CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1' 将任务结果使用'pickle'序列化成'json'格式 任务序列化方式 ...
task def mytask(): try: return do_work() except SoftTimeLimitExceeded: cleanup_in_a_hurry() 但是TimeLimitExceeded 会直接杀掉进程,raise 一个 TimeLimitExceeded,不能被 task 捕捉,所以应该两种方案配合使用,soft_time_limit=小int,time_limit=大int,使用soft 试图关闭进程超时就会被干掉。
@celery.task(bind=True, name='name') def function_name(): pass # task方法参数 name : 可以显式指定任务的名字;默认是模块的命名空间中本函数的名字。 serializer : 指定本任务的序列化的方法; bind : 一个bool值,设置是否绑定一个task的实例,如果绑定,task实例会作为参数传递到任务方法中,可以访问task实...