Celery 使用 Python 教程:Python 开发者必学的技术

2025年3月17日 | 阅读 8 分钟

在本教程中,我们将讨论 Python 开发者最受欢迎、必学且必备的技术。Python 开发者社区中的每个人都听说过 Celery,或者至少实现过一次。

在快速互联网时代,用户希望页面即时加载,并在几秒钟内获得结果。小任务可以在一秒或微秒内完成,但繁重的任务可能需要几秒钟甚至几分钟。

那么问题来了,如何在我们复杂的任务仍在加载时,提供快速的用户体验呢?

这就是异步编程发挥作用的地方。Celery 用于任务的并行执行。

Celery 提供了在 CPU 空闲时在后台运行程序/作业的功能。在深入探讨此主题之前,让我们先了解 Celery 的核心概念以及为什么使用它。

在本教程中,我们将讨论 Celery 的以下概念。

  • 什么是 Celery?
  • 它是如何工作的?
  • 什么是任务队列?
  • 什么是消息代理?
  • 它有什么用?
  • 它是如何工作的?
  • Celery 的特点
  • Celery 入门

什么是 Celery?

Celery 是一个开源的 Python 库,用于异步运行任务。它是一个任务队列,负责收集任务并以适当的方式分发给工作节点。它主要专注于实时操作,但也支持调度(运行定期任务)。它极大地增强了最终用户的体验。Celery 引入了多种消息代理,如 RabbitMQRedis

Celery 集成了各种 Web 框架,包括 Flask、Pylons、web2py、Tryton 和 Tornado。

它有什么用?

假设我们需要每分钟(或每小时)访问一次 API,或者我们想在一天结束时发送多封电子邮件。Celery 可以轻松地调度这类周期性任务。

让我们再举一个例子:用户发送一个请求,而页面加载时间过长。此时,Celery 通过在同一服务器或有时在不同服务器上运行部分功能作为延迟任务来减少页面加载时间。

Celery 的工作节点可以通过回调更新 UI,处理文件,发送电子邮件,更改数据库等等。

Celery 的主要优点是我们的应用程序可以继续响应客户端请求。因此,最终用户不必不必要地等待。

Celery 如何工作?

在传统的 HTTP 请求-响应周期中,当客户端向服务器发送请求时,服务器将响应发送回客户端。这对于小型任务来说工作正常,但在尝试加载大型任务时可能会变慢。因此,我们需要实现一项功能来减少加载时间。

让我们了解 Celery 的工作场景。

Celery 通过消息进行交互;通常,代理充当客户端和工作节点之间的中介。Celery 的内部工作遵循生产者-消费者模式。Celery 在高层次上有三个主要组件。

生产者 - 生产者是管理 Web 请求的“Web 节点”。当应用程序处理时,任务会被分配给 Celery,即被推入任务队列。

消费者 - 消费者是“工作节点”,它们监控队列头部,工作节点获取任务并执行它们。工作节点还可以执行各种任务;因此,它们也可以充当生产者。

队列 - 它基本上是一个消息代理,充当生产者和消费者之间的桥梁。它本质上是在 Web 应用程序和 Celery 工作节点之间传递消息。Celery 对 RabbitMQ 和 Redis 有广泛的支持,也支持 Zookeeper、Amazon SQS,但功能有限。

Celery 的特点

Celery 是一个方便的框架,通过延迟任务来减少生产负载,因为它支持异步和计划任务。以下是 Celery 的一些重要特性。

  • 开源库 - Python Celery 是开源且免费的软件。这一特性吸引了组织或开发者使用 Celery 并免费解决他们的任务。
  • 安装简单 - 它是一个轻量级且简单的库,易于安装。我们可以通过终端使用命令“pip install -U Celery”安装它。
  • 调度 - 我们可以使用 datetime 模块和 celery beat 来指定运行任务的具体时间。Celery beat 可以定期触发任务。我们可以为基于简单间隔的重复事件使用周期性任务。
  • 代理支持 - Celery 支持多种消息代理,最流行的是 RabbitMQ。它还支持 Amazon SQS,但缺少一些功能(监控和远程控制)。
  • 与 Web 框架集成 - Celery 还集成了各种 Python Web 框架,如 Pyramid、Pylons、Django、Tornado、Trylons 和 Flask。
  • 快速 - Celery 每分钟可以处理数百万个任务。
  • 工作流 - 它可以使用一组高级原语(称为“canvas”)来组成简单和复杂的工作流。

Celery 入门

在本教程中,我们将使用 Django 实现 Celery,并创建一个简单的任务队列。让我们按照以下步骤开始。

创建 Django 项目

首先,我们将在 celery_django 文件夹中创建一个名为 learn_celery 的 Django 项目。但首先,我们将创建一个虚拟环境。所有依赖项都将存储在虚拟环境中。

C:\Users\User\Desktop\celery_django>python -m venv myenv

创建虚拟环境后,我们将使用以下命令激活它。

C:\Users\User\Desktop\celery_django>myenv/bin/activate

使用以下命令安装 Django。

pip install django

安装 Django 后,创建一个项目。我们使用以下命令创建了一个名为 learn_celery 的项目。

C:\Users\User\Desktop\celery_django>django-admin startproject learn-celery

如果您不熟悉如何在 Django 中创建项目或应用,可以访问我们的Django 教程。 现在,我们准备在虚拟环境中安装 Celery。

安装

我们可以使用以下命令安装 Celery。

pip install celery

安装 celery 后,我们将配置 Django 项目中的 Celery。

Celery 配置

打开项目的 settings.py 文件并添加以下配置。我们使用 redis 作为消息代理。

# Celery Settings CELERY_BROKER_URL = 'redis://127.0.0.1:6379' CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_RESULT_SERIALIZER = 'json' CELERY_TASK_SERIALIZER = 'json'CELERY_TIMEZONE = 'Asia/Kolkata'

选择代理

代理是允许应用程序、系统和服务进行通信和共享信息的独立服务。为了简化这个术语,我们通过消息队列将任务分配给工作节点。消息队列是一种先进先出 (FIFO) 的数据结构,这意味着最先放入的消息将最先执行。所有任务都将按照我们添加它们的顺序执行。

在本教程中,我们将使用 Redis Message Broker。

在 Windows 上安装 Redis

在 Mac/Ubuntu 上安装 Redis 非常直接,但在 Windows 上则有点棘手。因此,这里我们描述如何在 Windows 上安装 redis。

  • 访问 Github 链接 https://github.com/tporadowski/redis/releases,然后点击 Redis-x64-5.0.14.msi。它将下载 .msi 文件。
    Celery Tutorial Using Python
  • 点击下载的安装程序。它将自动在您的系统中 C: 驱动器中安装 redis。安装完成后,打开 redis-cli 并输入 PING。
    Celery Tutorial Using Python

运行 celery 程序还需要 redis 依赖。我们可以使用以下命令安装 redis 依赖。

pip install redis

安装完成后,使用以下命令启动服务器。

redis-server

我们可以在终端中输入以下命令来测试 Redis 是否正常工作。

redis-cli ping

如果它回复 PONG,则表示正常工作。

PS D:\celery> redis-cli ping PONG

注意 - Celery 和 Redis 可以使用下面的命令一起安装。

pip install -U Celery[Redis]

创建 celery.py 文件

现在,打开 Django 项目中的 celery.py 文件并添加以下代码。

Celery.py

创建 Celery 任务

Celery 任务可以在 Django 应用/项目的 tasks.py 文件中创建。我们使用以下命令在工作目录中创建一个应用。

创建应用程序后,创建一个 task.py 文件并创建任务。任务是可以通过 Celery 调用的常规 Python 函数。例如 - 我们创建一个打印 1 到 10 整数的函数。

现在,在 view.py 文件中创建一个视图。

view.py

现在我们将此视图映射到 urls.py 文件中的 URL。

CeleryApp/urls.py

注意 - 要查看 celery 结果,请安装以下第三方应用并在 settings.py 文件中注册。

现在我们准备执行第一个异步任务。现在运行 python manage.py runserver 并点击本地主机链接 http://127.0.0.1:8000/。

本地运行 Celery

现在打开新终端并导航到项目目录,激活虚拟环境。要启动 celery 工作节点,请运行以下命令。

正如我们所见,我们的 Celery 已启动并准备好执行后台作业。Redis 消息代理默认运行在 6379 端口。

每次我们访问 http://127.0.0.1:8000/ 向 Django 服务器发出请求时,我们都应该看到响应,并且 Celery 在后台异步执行了我们在 task.py 文件中定义的任务。这可以在 Celery 终端中进行监控。

Celery Tutorial Using Python

结论

Celery 是一个强大的作业队列,用于在后台运行任务。它最常用于发送频繁的电子邮件。但是,它也可以以多种方式使用。我们可以设置一个队列;处理长期任务中的数据块,并定义执行任务的时间。

在本教程中,我们以 Django 为例,提供了一个简单的 Celery 示例。我们定义了 Celery 的基本概念及其工作原理。我们还指定了如何将 Celery 与 Django 一起实现。您可以参考本教程并使用 Celery 运行您的异步任务。