Celery源码学习 Task类详解

77 阅读3分钟

Celery Task 类详解

Celery 的 [Task]task.py ) 类是所有任务的基类,定义了任务的生命周期、执行逻辑、状态管理和扩展钩子。每个通过 @app.task 装饰器注册的任务,实际上都是 Task 的子类实例。


1. 主要作用

  • 定义任务接口:所有任务都必须实现 run() 方法,作为任务的实际执行体。
  • 任务状态管理:内置任务状态(成功、失败、重试等)和相关回调(如 on_success, on_failure)。
  • 异步执行:通过 apply_async()delay() 方法将任务发送到消息队列,实现异步分布式执行。
  • 重试机制:支持任务自动重试(retry())。
  • 结果管理:集成结果后端,支持任务结果存储和查询。
  • 生命周期钩子:支持任务执行前后、成功、失败、重试等自定义处理。

2. 关键属性

  • name:任务名称(唯一标识)。
  • max_retriesdefault_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 任务的核心抽象,负责任务定义、执行、状态管理和扩展。
  • 通过继承和装饰器,用户可以灵活定制任务行为和生命周期。
  • 支持分布式异步执行、重试、结果管理和丰富的扩展钩子。