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

相关推荐
沐怡旸11 分钟前
【算法】725.分割链表--通俗讲解
算法·面试
Chh4322411 分钟前
React 新版
后端
Miracle65829 分钟前
【征文计划】Rokid CXR-M SDK全解析:从设备连接到语音交互的AR协同开发指南
后端
沐怡旸29 分钟前
【底层机制】【Android】深入理解UI体系与绘制机制
android·面试
合作小小程序员小小店41 分钟前
web开发,学院培养计划系统,基于Python,FlaskWeb,Mysql数据库
后端·python·mysql·django·web app
笃行3501 小时前
基于Rokid CXR-S SDK的智能AR翻译助手技术拆解与实现指南
后端
文心快码BaiduComate1 小时前
代码·创想·未来——百度文心快码创意探索Meetup来啦
前端·后端·程序员
渣哥1 小时前
面试官最爱刁难:Spring 框架里到底用了多少经典设计模式?
javascript·后端·面试
代码充电宝2 小时前
LeetCode 算法题【简单】20. 有效的括号
java·算法·leetcode·面试·职场和发展
疯狂的程序猴2 小时前
iOS混淆实战全解析,从源码混淆到IPA文件加密,打造苹果应用反编译防护体系
后端