Skip to content

1 什么是 Celery?

1.1 定义

Celery 是一个简单、灵活且可靠的分布式系统,专注于处理大量消息的异步任务队列,同时也支持任务调度。

celery

  1. user(用户)

    可以是浏览器里的前端用户,也可以是你的后端服务/脚本/另一个微服务。

    他做的一件事:发起一个需要执行的任务,比如:

    python
    result = long_task.delay(123, "abc")

    这一步不是直接执行 long_task,而是:

    "把任务交给 Celery 系统去慢慢跑,我只拿一个 task_id 回来。"

  2. AMQP broker(消息中间件/队列)

    消息队列(broker),常见的就是:RabbitMQ、Redis(虽然严格不是 AMQP,但 Celery 也支持)、其他 MQ。

    它负责:

    • 接任务:你的应用调用 .delay() / apply_async(),Celery 把任务序列化后丢到队列里(发给 broker)
    • 存任务:任务在队列里排队,等待被 worker 消费
    • 分发任务:哪个 worker 空下来,会从队列里"领一个任务"走

    你可以把 broker 当成:"一个任务仓库 + 排队系统,谁有空谁来领活。"

  3. celery workers(执行任务的工人)

    中间竖着的 1、2、3 … N,就是多个 Celery worker 进程:

    • 每个 worker 都是一个独立的后台进程
    • 它们都连接到了 broker
    • 不停地从队列里取任务 → 执行 → 写结果

    它们干的就是:

    • 从 broker 取一个 task
    • 在本地 Python 进程里执行你定义的函数
    • 执行完后把结果状态写到 "task result store"
  4. task result store(任务结果存储)

    最右边这个圆柱,是结果存储 backend,可以是:

    • Redis
    • 数据库(如 PostgreSQL/MySQL)
    • Memcached
    • RPC backend(直接通过 AMQP 回传)

Celery 中叫 result backend,负责:

存每个任务的:

  • 状态:PENDING / STARTED / SUCCESS / FAILURE / RETRY

  • 返回值:比如你的函数 return 42

  • 异常信息:如果执行时抛异常

    支持用户之后查询:

    python
    from celery.result import AsyncResult
    
    res = AsyncResult(task_id)
    res.status  # 当前状态
    res.result  # 结果或异常
    res.get()  # 阻塞直到有结果

    相当于:worker 做完了,把"成绩单"丢到 result store 里,你日后可以拿着 task_id 去查。

1.2 使用场景

Celery 是一个强大的分布式任务队列的异步处理框架,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。我们通常使用它来实现异步任务(async task)和定时任务(crontab)。

  • 异步任务:将耗时操作任务提交给 Celery 去异步执行,比如发送短信/邮件、消息推送、音视频处理等等
  • 定时任务:定时执行某件事情,比如每天数据统计

1.3 Celery 的优点

  • Simple(简单):Celery 使用和维护都非常简单,并且不需要配置文件。
  • Highly Available(高可用):worker 和 client 会在网络连接丢失或者失败时,自动进行重试。并且有的 brokers 也支持"双主"或者"主/从"的方式实现高可用。
  • Fast(快速):单个的 Celery 进程每分钟可以处理百万级的任务,并且只需要毫秒级的往返延迟(使用 RabbitMQ, librabbitmq, 和优化设置时)。
  • Flexible(灵活):Celery 几乎每个部分都可以扩展使用,自定义池实现、序列化、压缩方案、日志记录、调度器、消费者、生产者、broker 传输等等。

1.4 Celery 安装

你可以安装 Celery 通过 Python 包管理平台(PyPI)或者源码安装。

使用 pip 安装:

bash
pip install -U Celery

构建时间:11/21/2025, 1:28:39 PM | 本博客内容均为自己学习,如内容涉及侵权,请联系邮箱:pangzl0215@163.com