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 秒执行一次。

相关推荐
啃瓜子的松鼠几秒前
Nginx 学习笔记
linux·后端·nginx
2301_7930868710 分钟前
设置github 代理
github
救救孩子把14 分钟前
Spring Framework启动机制深度解析
java·后端·spring
Yvsanf20 分钟前
github使用
github
果冻人工智能25 分钟前
一张天价程序员账单的故事
后端
uhakadotcom34 分钟前
Vulkan API 入门指南:跨平台、高性能的图形和计算解决方案
后端·面试·github
uhakadotcom41 分钟前
Meta Horizon OS 开发工具:打造更好的 MR/VR 体验
javascript·后端·面试
程序员小刚1 小时前
基于SpringBoot + Vue 的考勤管理系统
vue.js·spring boot·后端
星辰大海的精灵1 小时前
SpringAI轻松构建MCP Client-Server架构
人工智能·后端·架构