Flask中Celery特定任务自定义超时时间的设置方法
调整Celery特定任务的超时时间(Flask场景)
要把这个特定任务的超时从默认30分钟改成1小时,有两种实用的方式,你可以根据需求选择:
方式一:发送任务时动态指定超时
直接在send_task的options参数里合并默认重试策略和自定义超时配置,既保留原有重试逻辑,又覆盖超时时间:
@async_runner.app.task(name='task_name') def async_task(): # 合并默认重试策略与自定义超时设置 custom_task_options = { **async_runner.DEFAULT_RETRY_POLICY, 'time_limit': 3600, # 硬超时:1小时(单位为秒) 'soft_time_limit': 3600 # 软超时:1小时,用于任务优雅退出,可选 } async_runner.send_task( task_fn=task_processing, queue='queue_name', options=custom_task_options )
这里给你区分下两个超时参数的作用:
time_limit:硬超时,一旦任务运行超过这个时间,Celery Worker会直接强制终止任务进程,适合不需要优雅收尾的场景。soft_time_limit:软超时,到达时间后会给任务发送SoftTimeLimitExceeded异常,你可以在task_processing里捕获这个异常,做一些清理工作(比如关闭数据库连接、保存中间状态)。如果不需要软超时,只设置time_limit即可。
方式二:给任务本身设置默认超时
如果希望task_processing这个任务无论在哪里调用,默认都是1小时超时,那可以在定义任务时直接通过装饰器参数指定:
@async_runner.app.task( name='task_processing', time_limit=3600, soft_time_limit=3600 ) def task_processing(): # 你的任务处理逻辑 pass
这种方式一劳永逸,之后所有调用这个任务的地方,除非在send_task里特意覆盖options,否则都会使用这个1小时的超时设置。
需要注意的是,在Flask+Celery的场景下,单个任务的超时设置优先级高于全局配置(比如CELERYD_TASK_TIME_LIMIT),所以上面两种方式都能正常生效。
内容的提问来源于stack exchange,提问作者Kishan Mehta
相关产品推荐
相关产品推荐

