Celery 是一个基于分布式消息传递的开源异步任务队列系统,主要使用 Python 编写。它把耗时的操作从主程序中分离出来,交由一个或多个工作进程并发执行,并支持任务调度、失败重试与结果存储。Celery 通信依赖消息中间件来在客户端与工作进程之间传递消息,可运行于单机、多机乃至跨数据中心环境,常被用于处理邮件发送、数据处理等后台作业。
定义
Celery 是一个开源的异步任务队列,也被称为作业队列,建立在分布式消息传递机制之上。它把执行单元称作任务,任务可在一个或多个工作节点上并发运行,既可异步执行,也可同步等待结果。[1] 它侧重实时处理,同时也支持任务调度。[2]
Celery 使用 Python 编写,但其协议可以被任何语言实现,因此并不局限于 Python 生态。[2] 项目以 BSD 许可证开源发布。[3]
原理
任务队列的作用是把工作分散到不同线程或机器上执行。队列的输入是一个工作单元,即任务。专门的工作进程持续监视队列,取出新任务并执行。[2] 一个 Celery 系统可由多个工作进程和多个消息中间件组成,从而实现高可用与横向扩展。[2]
Celery 通过消息通信,通常借助消息中间件在客户端与工作进程之间中转。客户端要发起一个任务时,先把一条消息放入队列,中间件再把这条消息投递到某个工作进程。[2] 任务的结果可以被保存起来供之后查询,存放结果的组件称为结果后端。[4]
任务的并发执行可以依托多进程、协程或线程等多种方式实现。任务通过装饰器定义,调用时使用 delay 或 apply_async 等方法把消息投递到队列。[5] 除了单个任务,Celery 还提供称为 canvas 的工作流原语,用于组合复杂流程:chain 让任务按顺序依次执行,把前一个任务的结果传给下一个;group 让多个任务并行执行并汇总结果;chord 先并行执行一组任务,再在所有任务完成后调用一个回调。这类编排由 Celery 自身完成,而非依赖中间件。[6]
发展历程
Celery 的最初代码版权可追溯至 2009 年,作者为 Ask Solem,此后陆续加入多位贡献者;2012 年至 2014 年间版权还曾归属 GoPivotal 公司。[7]
Celery 起初是为配合 Django 框架而创建的,后来发展为可用于任何 Python 项目。[8] 早期版本推荐使用 RabbitMQ 作为消息中间件,后来也支持 Redis 和数据库等多种传输方式。[8] 在此后的迭代中,项目增加了对多种结果后端、序列化格式和并发模型的支持。[2]
应用
Celery 用于把耗时的操作放到后台执行,避免阻塞用户请求,常见用途包括邮件发送、消息推送以及需要较长时间的数据处理。[9] 它也支持类似 cron 的周期性任务,可以按固定间隔或指定时间点触发,适用于日志清理、定时统计等场景。[9]
在框架结合方面,Celery 可以较方便地集成进 Web 框架,部分框架还配有专门的集成包,这些包并非必需,但能简化开发,有时还能提供在进程分叉时关闭数据库连接之类的钩子。[2] 除 Python 之外,社区还提供面向 Node.js、Go、Rust 等语言的客户端实现。[2]
局限
Celery 在消息投递上采用至少一次的语义。工作进程若在执行完成前崩溃或被强制终止,中间件会把该任务重新投递给其他进程,从而可能造成同一任务被重复执行。[10] 因此涉及支付、库存扣减等操作时,任务本身通常需要设计成幂等的,否则重复执行会影响数据一致性。[10]
在简单场景下 Celery 表现稳定,但随着业务复杂度上升,容易给人一种不必要的安心感,任务可能在链路的多个环节丢失,配置项也较为繁琐。[10] 使用 canvas 工作流时,若某个子任务失败,后续任务和回调不会执行。[6]
Celery 本身并不支持 Windows 平台的运行。[11] 此外,任务消息中携带的敏感信息在中间件中仍可能被读取或截获,对含敏感数据的任务需要进行额外处理。[12]
参见
参考资料
- 软件包:celery(5.6.3-2) [引用日期2026-10-14]
- Introduction to Celery [引用日期2026-10-14]
- Celery - Distributed Task Queue¶ [引用日期2026-10-14]
- Introduction¶ [引用日期2026-10-14]
- celery — Distributed processing¶ [引用日期2026-10-14]
- Canvas Workflows [引用日期2026-10-14]
- softwareheritage.org 上的网页 [引用日期2026-10-14]
- Introduction — Celery 1.0.6 (stable) documentation [引用日期2026-10-14]
- Django 实战:Celery 异步任务从环境搭建到调用全掌握 [引用日期2026-10-14]
- pretalx.com 上的网页 [引用日期2026-10-14]
- Celery Documentation [引用日期2026-10-14]
- Tasks¶ [引用日期2026-10-14]