Celery Task 类详解
Celery 的 [Task]task.py ) 类是所有任务的基类,定义了任务的生命周期、执行逻辑、状态管理和扩展钩子。每个通过 @app.task 装饰器注册的任务,实际上都是 Task 的子类实例。
1. 主要作用
- 定义任务接口:所有任务都必须实现
run()方法,作为任务的实际执行体。 - 任务状态管理:内置任务状态(成功、失败、重试等)和相关回调(如
on_success,on_failure)。 - 异步执行:通过
apply_async()、delay()方法将任务发送到消息队列,实现异步分布式执行。 - 重试机制:支持任务自动重试(
retry())。 - 结果管理:集成结果后端,支持任务结果存储和查询。
- 生命周期钩子:支持任务执行前后、成功、失败、重试等自定义处理。
2. 关键属性
name:任务名称(唯一标识)。max_retries、default_retry_delay:最大重试次数和重试间隔。rate_limit:速率限制。ignore_result:是否忽略任务结果。track_started:是否追踪任务开始状态。acks_late:是否任务执行后再确认消息。throws:预期异常类型。backend:结果后端。app:关联的 Celery 应用实例。
3. 关键方法
任务执行相关
-
run(self, *args, **kwargs)
任务的实际执行体,必须由子类实现。 -
__call__(self, *args, **kwargs)
直接调用任务时执行run(),并管理请求上下文。
异步执行
-
apply_async(self, args=None, kwargs=None, ...)
异步发送任务到队列,返回AsyncResult。 -
delay(self, *args, **kwargs)
apply_async的简化版,常用快捷方式。
生命周期钩子
-
before_start(self, task_id, args, kwargs)
任务开始前调用。 -
on_success(self, retval, task_id, args, kwargs)
任务成功时调用。 -
on_failure(self, exc, task_id, args, kwargs, einfo)
任务失败时调用。 -
on_retry(self, exc, task_id, args, kwargs, einfo)
任务重试时调用。 -
after_return(self, status, retval, task_id, args, kwargs, einfo)
任务返回后调用(无论成功或失败)。
其他功能
-
retry(self, ...)
任务重试,自动重新入队。 -
update_state(self, task_id=None, state=None, meta=None, ...)
手动更新任务状态。 -
apply(self, args=None, kwargs=None, ...)
本地同步执行任务(阻塞)。 -
signature(self, args=None, ...)
创建任务签名(用于链式调用、分组等)。
4. 代码示例
from celery import Celery
app = Celery('demo', broker='redis://localhost:6379/0')
@app.task(bind=True, max_retries=5, default_retry_delay=10)
def add(self, x, y):
try:
return x + y
except Exception as exc:
# 自动重试
raise self.retry(exc=exc)
# 生命周期钩子示例
def on_success(self, retval, task_id, args, kwargs):
print(f"Task {task_id} succeeded with result {retval}")
def on_failure(self, exc, task_id, args, kwargs, einfo):
print(f"Task {task_id} failed: {exc}")
5. 生命周期钩子说明
- 可通过重写
on_success,on_failure,on_retry,after_return等方法,实现任务执行过程中的自定义逻辑,如日志、监控、通知等。
6. 总结
Task类是 Celery 任务的核心抽象,负责任务定义、执行、状态管理和扩展。- 通过继承和装饰器,用户可以灵活定制任务行为和生命周期。
- 支持分布式异步执行、重试、结果管理和丰富的扩展钩子。