Python 库之 Celery 详解

Python 库之 Celery 详解

Celery 是一个用于分布式任务队列的强大 Python 库,可以帮助开发者轻松实现异步任务调度、高并发、任务重试等功能。它常用于 Web 开发、定时任务处理和后台作业。

本文将详细讲解 Celery 的核心概念、安装与配置,以及代码示例和图解,帮助你快速掌握 Celery 的使用。


一、什么是 Celery?

1. 核心概念

  • 分布式任务队列:Celery 使用生产者-消费者模型,将任务推送到队列中,由多个工作者(worker)异步执行。
  • 异步任务:任务可以独立于主进程执行,不阻塞主程序。
  • 高并发:Celery 能处理大量任务,支持任务优先级和调度。

2. 工作流程

  1. 任务生产者(Producer):定义并发送任务。
  2. 消息代理(Broker):管理任务队列。常用 RabbitMQ、Redis 等。
  3. 任务执行者(Worker):从队列中取出任务并执行。
  4. 结果后端(Backend):存储任务的执行结果。

图解:

+----------------+          +----------------+
| Task Producer  |   --->   |   Message      |
| (e.g., Web App)|          |   Broker       |
+----------------+          +----------------+
                                ↓
                          +----------------+
                          |   Worker       |
                          |   (Executor)   |
                          +----------------+
                                ↓
                          +----------------+
                          | Result Backend |
                          +----------------+

二、Celery 的安装与配置

1. 安装 Celery

使用 pip 安装:

pip install celery

安装 Redis 作为消息代理:

pip install redis

确保 Redis 服务已启动:

redis-server

2. 配置 Celery

创建一个名为 tasks.py 的文件:

from celery import Celery

# 配置 Celery 应用
app = Celery('tasks', broker='redis://localhost:6379/0', backend='redis://localhost:6379/0')

@app.task
def add(x, y):
    return x + y

三、使用 Celery 执行任务

1. 启动 Celery Worker

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

celery -A tasks worker --loglevel=info

Worker 会监听任务队列并执行任务。

2. 发送任务

在另一个 Python 脚本中调用任务:

from tasks import add

# 调用任务
result = add.delay(4, 6)  # 异步调用
print("任务提交完成,结果:", result.id)

# 检查任务结果
print("任务结果:", result.get(timeout=10))

3. 任务结果查看

运行代码后,你会在 Worker 的日志中看到类似以下的输出:

[2024-11-27 12:00:00,000: INFO/MainProcess] Received task: tasks.add[1234abcd]
[2024-11-27 12:00:00,010: INFO/MainProcess] Task tasks.add[1234abcd] succeeded in 0.01s: 10

四、进阶使用

1. 定时任务

结合 celery-beat 实现定时任务:

pip install celery[redis] celery[django] django-celery-beat

定义周期性任务:

from celery import Celery
from celery.schedules import crontab

app = Celery('periodic_tasks', broker='redis://localhost:6379/0')

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    sender.add_periodic_task(10.0, test.s('hello'), name='add every 10 seconds')
    sender.add_periodic_task(
        crontab(minute='*/1'),
        test.s('world'),
        name='say hello every minute',
    )

@app.task
def test(arg):
    print(arg)

启动 Worker 和 celery-beat 调度:

celery -A periodic_tasks worker --loglevel=info
celery -A periodic_tasks beat --loglevel=info

2. 任务重试

任务失败时可以重试:

from celery import Celery

app = Celery('retry_task', broker='redis://localhost:6379/0')

@app.task(bind=True, max_retries=3)
def retry_task(self):
    try:
        # 模拟错误
        raise ValueError("模拟任务失败")
    except Exception as exc:
        raise self.retry(exc=exc, countdown=5)  # 5 秒后重试

五、Celery 优势和应用场景

1. 优势

  • 异步执行:主程序不必等待任务完成。
  • 高扩展性:支持分布式任务调度。
  • 灵活性:支持多种消息代理和结果存储后端。

2. 应用场景

  • Web 应用:处理后台作业(如邮件发送、图片处理)。
  • 数据处理:处理批量任务(如数据清洗、ETL 操作)。
  • 定时任务:定时触发特定任务。

六、总结

Celery 是一个功能强大的分布式任务调度库,其灵活性和高效性使其成为异步任务处理的首选工具。从简单的异步任务到复杂的定时任务,Celery 都能胜任。

通过本文的图解和代码示例,你可以快速上手 Celery 并应用到实际项目中。进一步学习可以深入研究 Celery 的任务优先级、路由和监控工具(如 Flower)。

推荐阅读

最后修改于:2024年11月27日 20:58

评论已关闭

推荐阅读

DDPG 模型解析,附Pytorch完整代码
2024年11月24日
DQN 模型解析,附Pytorch完整代码
2024年11月24日
AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日