使用Python的Celery教程:Python开发者必学技术
在本教程中,我们将讨论Python开发者最受欢迎、必学的技术。Python开发协会的每个人都学过Celery,或者至少实践过一次。
在高速互联网时代,用户希望页面可以瞬间加载并在几秒钟内得到结果。小任务可以在一秒或微秒内执行,但是复杂任务可能需要很多秒甚至一分钟。
所以问题是,我们如何在复杂任务仍在加载时提供快速的用户体验?
这就是异步编程的作用。Celery用于任务的并行执行。
当CPU处于空闲状态时,Celery提供在后台运行程序/任务的能力。在深入探讨这个话题之前,让我们先了解Celery的核心概念以及为什么我们使用它。
在本教程中,我们将讨论以下Celery的核心概念。
- 什么是Celery?
- 它如何工作?
- 什么是任务队列?
- 什么是消息代理?
- 为什么有用?
- 它如何工作?
- Celery的特性
- 开始使用Celery
什么是Celery
Celery是一个开源的Python库,用于异步运行任务。它是一个任务队列,将任务分发给工作进程以正确的方式执行。它主要专注于实时操作,但也支持定时任务(定期运行的任务)。它极大地增强了用户体验。Celery引入了各种消息代理,如 RabbitMQ 和 Redis 。
Celery结合了多个Web框架,包括Flask、Pylons、web2py、Tryton和Tornado。
为什么Celery有用
假设我们需要每分钟(每小时)访问API,或者我们想在一天结束时发送多封电子邮件。Celery可以轻松调度此类周期性任务。
我们再来考虑另一种情况:用户发送请求,而页面加载时间过长。同时,Celery通过在同一台服务器上或者不同的服务器上运行部分功能作为延迟任务来减少页面加载时间。
Celery的工作进程可以通过回调更新用户界面,处理文件,发送电子邮件,对数据库进行更改等等。
Celery的主要优势是我们的应用程序可以继续响应客户端请求,因此最终用户不必等待不必要的时间。
Celery是如何工作的
在传统的HTTP请求-响应周期中,当我们通过客户端向服务器发送请求时,服务器将响应发送给客户端。对于小任务,它可以正常工作,但是当我们尝试加载大型任务时,可能会变得很慢。因此,我们需要实现一个可以减少加载时间的功能。
让我们了解Celery的工作场景。
Celery通过消息进行交互;通常代理作为客户端和工作进程之间的中介。Celery的内部工作采用生产者和消费者模式。Celery在高层次上具有三个主要元素。
生产者 – 生产者是管理网页请求的“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
安装完成后,创建一个项目。我们将使用以下命令创建名为learn_celery的项目。
C:\Users\User\Desktop\celery_django>django-admin startproject learn-celery
如果您不熟悉如何在Django中创建项目或应用程序,可以参考我们的Django教程。
Django教程。
现在,我们可以在虚拟环境中安装Celery了。
安装
我们可以使用以下命令安装Celery。
pip install celery
在安装Celery后,我们将在Django项目中配置Celery。
Celery配置
打开项目的settings.py文件并添加以下配置。我们将使用Redis作为消息代理。
Celery设置 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'
选择一个代理
代理是一个独立的服务,可以使应用程序、系统和服务之间进行通信和共享信息。简单来说,我们通过消息队列将任务分配给工作者。消息队列是一个先进先出的数据结构,这意味着最先存储的消息将最先执行。所有任务将按照添加它们的顺序执行。
在本教程中,我们将使用Redis消息代理。
Windows中安装Redis
在Mac/Ubuntu中安装Redis非常简单,但在Windows中略微棘手。因此,我们在这里描述了如何在Windows中安装Redis。
- 访问GitHub链接 https://github.com/tporadowski/redis/releases ,并单击 Redis-x64-5.0.14.msi 。它将下载.msi文件。
- 点击下载的安装文件设置。它将自动在C驱动器中安装Redis。安装完成后,打开redis-cli并键入PING。
运行celery程序还需要安装Redis依赖。我们可以使用以下命令安装redis依赖。
pip install redis
安装完成后,使用以下命令启动服务器。
redis-server
我们可以通过在终端中键入以下命令来测试Redis是否正常工作。
redis-cli ping
如果回复是 PONG ,那么它工作正常。
PS D:\celery> redis-cli pingPONG
注意 – 可以使用下面的单个命令安装Celery和Redis。
pip install -U Celery[Redis]
创建celery.py文件
现在在Django项目中打开celery.py文件,并添加以下代码。
Celery.py
import os
from celery import Celery
from celery.schedules import crontab
# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'learn_django.settings')
#pass the project name in Celery(project_name)
app = Celery('learn_django')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
#Celery Beat Settings
app.conf.beat_schedule = {
'send-mail-every-day-at-8' : {
'task': 'emailExample.tasks.send_mail_func',
'schedule': crontab(hour = 15, minute = 42),
}
}
# Load task modules from all registered Django apps.
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print(f'Request: {self.request!r}')
创建一个Celery任务
Celery任务可以在Django应用程序/项目的 tasks.py 中创建。我们可以使用下面的命令在工作目录中创建一个应用程序。
C:\Users\User\Desktop\celery_django>python manage.py startapp celeryApp .
一旦应用程序创建完成,创建一个 task.py 文件并创建一个任务。任务是常规的 Python 函数,使用 Celery 进行调用。例如 – 我们创建一个函数,用于打印1到10的整数。
rom celery import shared_task
@shared_task(bind=True)
def test_func(self):
for i in range(10):
print(i)
return "Completed"
现在在view.py文件中创建一个视图。
view.py
from django.http import HttpResponse
# importing task from tasks.py file
from .tasks import test_func
# Create your views here.
def test(request):
# call the test_function using delay, calling task
test_func.delay()
return HttpResponse("Done")
现在我们将在urls.py文件中将这个视图映射到URL。
CeleryApp/urls.py
from django.urls import path
urlpatterns = [
path('', test, name='test'),
注意 – 要查看芹菜的结果,请安装以下第三方应用程序并在settings.py文件中注册。
pip install django-celery-result
现在我们已准备好执行第一个异步任务。现在运行 python manage.py runserver 并点击本地主机链接http://127.0.0.1:8000/。
在本地运行Celery
现在打开新的终端并导航到项目目录,激活虚拟环境。要启动celery worker,请运行以下命令。
PS D:\celeryPython> celery -A CeleryDjango.celery worker --pool=solo -l info
如我们所见,我们的Celery已启动并准备执行后台任务。Redis消息代理默认运行在端口6379。
[2022-01-07 23:10:27,920: INFO/MainProcess] Connected to redis://127.0.0.1:6379//
[2022-01-07 23:10:27,936: INFO/MainProcess] mingle: searching for neighbors
[2022-01-07 23:10:29,007: INFO/MainProcess] mingle: all alone
[2022-01-07 23:10:29,029: WARNING/MainProcess] C:\Users\DEVANSH SHARMA\.virtualenvs\celeryPython-O5XHNBO2\lib\site-packages\celery\fixups\django.py:203: UserWarning: Using settings.DEBUG leads to a memory
leak, never use this setting in production environments!
warnings.warn('''Using settings.DEBUG leads to a memory
每次访问http://127.0.0.1:8000/向Django服务器发出请求时,我们应该看到响应并且Celery在后台异步执行了我们在task.py文件中定义的任务。可以在Celery终端中监视这一过程。
结论
Celery是一个强大的任务队列,用于在后台运行任务。它最常用于发送频繁的电子邮件。但是,它可以用于多种方式。我们可以设置一个队列;在长时间运行的任务中处理数据块,并定义执行任务的时间。
在本教程中,我们以Django使用Celery为简单示例。我们定义了Celery的基本概念以及它的工作原理。我们还说明了如何将Celery与Django一起实现。您可以参考本教程并使用Celery运行异步任务。