Celery入门指南:异步任务处理与分布式调度

什么是Celery

Celery 是一个基于 Python 的分布式任务队列框架,专注于实时处理异步任务和任务调度。它允许将耗时的任务从主应用程序中异步分离出来,并通过消息传递在多个进程、主机或数据中心中执行这些任务

Celery 架构

  • 消息中间件(Broker) :Celery 不提供消息服务,但支持与 RabbitMQ、Redis 等第三方消息中间件集成。这些中间件负责接收任务并将其分发给 Worker
  • 任务执行单元(Worker) :Worker 是 Celery 提供的任务执行单元,可以并发运行在分布式系统的多个节点上,从而提高任务处理效率
  • 任务结果存储(Result Backend) :用于存储 Worker 执行任务的结果,支持多种存储方式,如 Redis、RabbitMQ 等

Celery 常用场景

  • 异步任务处理:将耗时操作如发送邮件、处理图像等异步执行,以提高应用程序的响应速度
  • 定时任务:通过 Celery Beat 进行任务调度,定期执行任务
  • 分布式任务调度:支持多个 Worker 的分布式部署,实现任务的负载均衡和高可用性

如何使用 Celery

1. 安装 Celery

使用 pip 安装 Celery:

bash 复制代码
pip install celery

2. 配置 Celery

创建一个 Celery 应用实例,指定消息代理(Broker)和结果后端(Result Backend):

python 复制代码
from celery import Celery

app = Celery('my_app', broker='redis://localhost', backend='redis://localhost')

3. 定义任务

使用 @app.task 装饰器定义需要异步执行的任务:

python 复制代码
@app.task
def add(x, y):
    return x + y

4. 启动 Celery Worker

在终端中运行以下命令启动 Celery Worker:

css 复制代码
bash
celery -A my_app worker --loglevel=info

5. 触发任务

在主应用程序中触发异步任务的执行:

ini 复制代码
python
result = add.delay(5, 5)

6. 获取任务结果

使用 result.get() 方法获取任务的执行结果:

python 复制代码
print(result.get())

7. 配置文件

可以通过配置文件(如 celeryconfig.py)来设置 Celery 的参数,如序列化方式、任务过期时间等:

python 复制代码
CELERY_TASK_SERIALIZER = 'msgpack'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24

示例案例

异步执行多个任务

python 复制代码
from proj.tasks import add
import time

t1 = time.time()

r1 = add.delay(1, 2)
r2 = add.delay(2, 4)
r3 = add.delay(3, 6)

r_list = [r1, r2, r3]

for r in r_list:
    while not r.ready():
        pass
    print(r.result)

t2 = time.time()
print('共耗时:%s' % str(t2-t1))

在这个例子中,我们异步执行了三个任务,尽管每个任务都有 1 秒的延迟,但总耗时仍然接近 1 秒,因为任务是并发执行的。

Celery Beat 任务调度

可以使用 Celery Beat 来定时执行任务。首先,需要在配置文件中定义调度任务:

python 复制代码
from celery.schedules import crontab

CELERY_BEAT_SCHEDULE = {
    'add-every-10-seconds': {
        'task': 'proj.tasks.add',
        'schedule': 10.0,  # 每10秒执行一次
        'args': (5, 5)
    },
}

然后,启动 Celery Beat 进程:

bash 复制代码
celery -A my_app beat --loglevel=info

这将使任务每 10 秒执行一次。

相关推荐
钱栈up11 小时前
GitHub 热榜上手|AnyPS5:44k star 免模拟转译 PS5
github
怕浪猫11 小时前
Claude Code vs Codex:Computer Use 实现原理深度拆解
算法·面试·github
喵了几个咪11 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
Flynt11 小时前
我把微信运动的排行榜和定点推送复刻了一遍:100万次步数更新只要4秒,坑在别处
redis·后端·性能优化
wflynn12 小时前
GitHub 今日推荐|gpu-unlock-ada:Ada 显卡张量算力翻倍解锁
开源·github·c
_孤傲_14 小时前
快速掌握 MySQL 语法
数据库·后端·mysql
考研保研资料分享15 小时前
无论文竞赛保研中科院植物所:三场考核、科研追问与准备复盘
面试
救救孩子把15 小时前
AI面试八股文-23_23-Agent可观测性与生产监控面试题
人工智能·面试·职场和发展·agent·langsmith·langfuase
IT_陈寒15 小时前
Java静态变量初始化坑得我头皮发麻
前端·人工智能·后端
步行cgn16 小时前
Thymeleaf 编辑表单详解:从字段回填到模拟 PUT 请求
后端