”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 了解 Celery 中的任务、代理、工作人员和后端

了解 Celery 中的任务、代理、工作人员和后端

发布于2024-07-30
浏览:885

Understanding tasks, brokers, workers, and backends in Celery

芹菜学习起来可能令人望而生畏。虽然它的文档很全面,但它倾向于跳过基础知识。

这篇文章将定义 Celery 中的四个主要概念,讨论 Celery 和 Kombu 之间的关系,并使用一些代码示例来说明 Celery 在实际应用程序中如何有用。这些示例将使用 Django Web 框架及其 @shared_task 装饰器,但这些概念也适用于 Flask、FastAPI 等。

任务、代理、工作人员和后端

您将很难在当前的 Celery 文档中找到一个位置来清楚地说明它所认为的经纪人后端,但是通过足够的挖掘,您可以找到和推断定义。

以下是开始使用 Celery 之前您应该了解的概念。

任务

A 任务是Celery将异步执行的一些工作(在这种情况下,这是“不立即”的一个奇特词)。在 Web 应用程序中,一项任务可能是在用户提交表单后发送电子邮件。发送电子邮件可能是一个需要多秒的操作,并且强制用户在重定向之前等待电子邮件发送可能会让应用程序感觉很慢。

任务是使用 Celery 中的装饰器定义的。下面我们使用 @shared_task 装饰器将 send_thank_you_email() 转换为可在 Submit_feedback() 表单提交处理程序中使用的 Celery 任务。

from config.celery import shared_task
from django.core.mail import send_mail
from django.shortcuts import render, redirect
from feedback.forms import FeedbackForm

@shared_task
def send_thank_you_email(email_address):
    send_mail(
        "Thank you for your feedback!",
        "We appreciate your input.",
        "[email protected]",
        [email_address],
    )

def submit_feedback(request):
    if request.method == "POST":
        form = FeedbackForm(request.POST)
        if form.is_valid():
            form.save()

            # Push the task to the broker using the delay() method.
            send_thank_you_email.delay(form.cleaned_data["email"])

            return redirect("/thank-you/")
    else:
        form = FeedbackForm()

    return render(request, "feedback.html", {"form": form})

当在 Celery 中使用装饰器定义任务时,它会向任务添加一个delay() 方法。您可以看到在成功保存表单后,send_thank_you_email 任务调用了上例中的delay() 方法。当delay()被调用时,它会将send_thank_you_email任务及其数据发送到存储它的broker,稍后将由worker执行,此时用户将通过电子邮件发送。

如果您在保存表单后需要发送额外的电子邮件,那么将工作推送到 Celery 的好处就变得更加明显。例如,您可能想向客户支持团队发送电子邮件,告知他们收到了新的反馈。对于 Celery,这几乎不会增加响应时间。

Celery 任务还允许额外的高级配置。如果电子邮件发送失败,您可以对任务进行编码以自动重试并配置 max_retries、retry_backoff、retry_jitter 等设置。

经纪人

Celery 增强提案的术语表对 消息代理有以下说法:

企业集成模式将消息代理定义为一个架构构建块,它可以从多个目的地接收消息,确定正确的目的地并将消息路由到正确的通道。

为了我们使用 Celery 的目的,我们将把 broker 视为存储创建的任务的“消息传输”。经纪人实际上并不执行任务:那是工人的工作。相反,代理是计划任务在计划任务时存储到,以及在工作人员最终执行任务时从拉出的地方。代理是 Celery 工作的必需的组件,Celery 将只连接到一个代理。

Celery 的后端和代理页面列出了一些其支持的代理,并且还有其支持但未列出的其他实验性代理(例如 SQLAlchemy)。这些代理(或“消息传输”)由 Celery 维护的 Python 消息传输库(称为 Kombu)管理。当寻找有关配置代理的信息时,查阅 Kombu 的文档而不是 Celery 的文档有时会很有帮助。

一些代理具有任务扇出和优先级等高级功能,而其他代理则作为简单队列运行。

工人

A worker 是 Celery 的一个实例,它从代理中提取任务并执行 Python 应用程序中定义的任务函数。 Celery 能够在其工作线程中运行 Python 代码,因为 Celery 本身是用 Python 编写的。

许多worker可以同时运行来执行任务。当您运行 celery worker 命令时,默认情况下它会为计算机的每个核心启动一个工作进程。如果你的电脑有16核,运行celeryworker将启动16个worker。

如果没有工作人员正在运行,消息(任务)将在代理中累积,直到工作人员可以执行它们。

后端

Celery 用户指南中的任务页面有以下关于 后端的内容

如果您想跟踪任务或需要返回值,那么 Celery 必须将状态存储或发送到某处,以便以后可以检索它们。有多种内置结果后端可供选择:SQLAlchemy/Django ORM、Memcached、RabbitMQ/QPid (rpc) 和 Redis – 或者您也可以定义自己的结果后端。

TLDR:后端跟踪异步任务的结果返回结果。这实际上意味着什么,什么时候有用?

假设您正在 Django 中构建一个可以生成年度报告的会计应用程序。该报告可能需要几分钟才能生成。

为了给您的用户提供响应更快的体验,您可以使用 AJAX 请求来启动报告生成任务。该请求返回任务的 ID,它可以使用该 ID 每隔几秒轮询一次服务器以查看是否生成了报告。任务完成后,它将返回报告的 ID,客户端可以使用该 ID 通过 JavaScript 显示报告的链接。

我们可以使用 Celery 和 Django 使用以下代码来实现这一点:

from celery import shared_task
from django.http import JsonResponse
from django.views.decorators.http import require_http_methods
from accounting.models import Asset
from accounting.reports import AnnualReportGenerator

@shared_task
def generate_report_task(year):
    # This could take minutes...
    report = AnnualReportGenerator().generate(year)
    asset = Asset.objects.create(
        name=f"{year} annual report",
        url=report.url,
    )
    return asset.id

@require_http_methods(["POST"])
def generate_annual_report_view(request):
    year = request.POST.get("year")
    task = generate_report_task.delay(year)
    return JsonResponse({"taskId": task.id})

def get_annual_report_generation_status_view(request, task_id):
    task = generate_report_task.AsyncResult(task_id)

    # The status is typically "PENDING", "SUCCESS", or "FAILURE"
    status = task.status
    return JsonResponse({"status": status, "assetId": task.result})

在此示例中,generate_report_task()返回的资产ID存储在后端中。后端存储结果返回结果。后端存储尚未处理的任务的状态:只有在有结果后才会添加这些状态。返回“PENDING”的任务具有完全未知的状态:关联的任务甚至可能不存在。任务通常会返回“SUCCESS”或“FAILURE”,但您可以在 Celery 状态文档中查看所有状态。

Celery 运行任务不需要后端。 但是,如果您需要检查任务的结果或返回任务的结果,则需要后端。如果您在 Celery 未配置后端时尝试检查任务的状态,则会引发异常。


我希望这篇文章可以帮助您了解 Celery 的各个部分以及您可能考虑使用它的原因。虽然官方文档很难理解,但深入学习 Celery 可以在你的 Python 应用程序中释放新的可能性。

版本声明 本文转载于:https://dev.to/tylerlwsmith/defining-tasks-brokers-workers-and-backends-in-celery-1982?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 目录:Django 基础知识
    目录:Django 基础知识
    点击此处收听我的直播 目录:Django 基础知识 Django简介 Django框架概述 安装Python 设置虚拟环境 安装 Django 创建您的第一个 Django 项目 Django 项目结构 理解 Django 的项目布局 管理 Django 设置 配置数据库设置 urls.py、vi...
    编程 发布于2024-11-02
  • Leetcode:交替合并字符串
    Leetcode:交替合并字符串
    问题陈述 1768.交替合并字符串 给定两个字符串,word1 和 word2,任务是通过交替字符将它们合并。该过程从 word1 开始,一直持续到一个字符串用完为止。较长字符串中的任何剩余字符都将附加到合并字符串的末尾。 我的思考过程 考虑到问题的简单性,我立即认...
    编程 发布于2024-11-02
  • 适合初学者开发人员的最佳网站
    适合初学者开发人员的最佳网站
    您是希望在科技行业(尤其是开发领域)开始职业生涯的初学者吗?我可能有资源可以帮助你! 尽管是 alx_africa 的一员,但我不断地通过沉浸于开发和为个人项目做出贡献来推动自己在技术领域学习和成长。 几个月前,在接受非洲领导力体验专业化培训时,我偶然发现了 roadmap.sh。这份综合指南是为渴...
    编程 发布于2024-11-02
  • FCS API 与 Insight Ease:比特币 API 服务的简单比较
    FCS API 与 Insight Ease:比特币 API 服务的简单比较
    如果您热衷于比特币 API,那么选择正确的 API 非常重要。特别是如果您是开发人员、金融分析师或经营一家金融科技公司。您会听到的两个流行名称是 FCS API 和 Insight Ease。但哪一个更好呢?让我们仔细观察一下它们的比较,特别是当涉及到加密货币实时汇率 API、加密货币 API 交...
    编程 发布于2024-11-02
  • 如何在不修改HTML的情况下用JavaScript监听表单提交事件?
    如何在不修改HTML的情况下用JavaScript监听表单提交事件?
    在 JavaScript 中监听表单提交事件而不修改 HTML在本文中,我们解决了在不修改 HTML 的情况下监听表单提交事件的常见挑战必须修改 HTML 代码。我们不依赖 HTML 中的 onClick 或 onSubmit 属性,而是提供纯 JavaScript 解决方案。为了实现这一点,我们利...
    编程 发布于2024-11-02
  • Document.getElementById 与 jQuery $():主要区别是什么?
    Document.getElementById 与 jQuery $():主要区别是什么?
    Document.getElementById vs jQuery $():比较分析深入研究 Web 开发领域时,了解普通版本之间的细微差别JavaScript 和 jQuery 可能至关重要。本文研究了两个看似相同的代码片段之间的细微差别:var contents = document.getEl...
    编程 发布于2024-11-02
  • 在 Java 中使用方法和变量句柄进行运行时对象访问和操作
    在 Java 中使用方法和变量句柄进行运行时对象访问和操作
    反射和方法/var 句柄是 Java 中的两个强大功能,允许开发人员在运行时访问和操作对象。然而,它们在访问和处理对象的方式上有所不同。 让我们看一个如何使用反射来访问类中方法的示例。我们将从一个名为“MyClass”的简单类开始,它有一个私有字符串变量和该变量的 getter 方法。为了创建这个对...
    编程 发布于2024-11-02
  • 如何在 Python 中使用内置函数验证 IP 地址?
    如何在 Python 中使用内置函数验证 IP 地址?
    Python 中的 IP 地址验证验证 IP 地址的有效性是编程中的常见任务。从用户处接收字符串形式的 IP 地址时,必须对其进行验证,以确保它们符合正确的格式和结构。要在 Python 中有效验证 IP 地址,请考虑以下方法:无需手动解析 IP 地址,而是利用套接字模块中的内置 inet_aton...
    编程 发布于2024-11-02
  • 我需要学习编程方面的帮助
    我需要学习编程方面的帮助
    您好,我是一名系统工程专业的学生,​​我觉得我在课程中学到的编程知识不多。我想自学,因为我对这个话题非常感兴趣。这就是我在这个网站上向了解编程的人寻求帮助的原因。如果有人知道学习编程的最佳课程,从基础开始并进步到更专业的水平,那将会有很大的帮助。 我感兴趣的语言: Java JavaScript P...
    编程 发布于2024-11-02
  • 如何将 gorm.Model 集成到具有日期时间支持的 Protocol Buffer 定义中?
    如何将 gorm.Model 集成到具有日期时间支持的 Protocol Buffer 定义中?
    将 gorm.Model 集成到 Protocol Buffer 定义中将 gorm 的 gorm.Model 字段集成到 protobuf 定义中时,由于 proto3 中缺乏日期时间支持,出现了挑战。本文探讨了此问题的解决方案。ProtoBuf 字段类型映射CreatedAt、UpdatedAt...
    编程 发布于2024-11-02
  • 修补您的 Discord 活动的网络请求,以实现顺利的 CSP 合规性
    修补您的 Discord 活动的网络请求,以实现顺利的 CSP 合规性
    通过Discord运行Discord活动时,您可能会遇到内容安全策略(CSP)问题。您可以通过确保网络请求遵循 Discord 代理 规则来修复这些问题。 这可以手动完成...或者你可以让@robojs/patch处理它。 什么是CSP? 内容安全策略 (CSP) 是一种安全标准,...
    编程 发布于2024-11-02
  • 推荐项目:删除课程表查看数据
    推荐项目:删除课程表查看数据
    LabEx 的这个项目释放了数据库管理的力量,提供了在数据库中创建和操作视图的全面学习体验。无论您是崭露头角的数据库管理员还是经验丰富的开发人员,该项目都提供了宝贵的机会来增强您的技能并获得对数据管理世界的实际见解。 深入了解基础知识 在这个项目中,您将踏上了解数据库中视图的核心概念...
    编程 发布于2024-11-02
  • 模拟网络请求变得容易:集成 Jest 和 MSW
    模拟网络请求变得容易:集成 Jest 和 MSW
    Writing unit tests that involve mocking or stubbing API calls can feel overwhelming—I’ve been there myself. In this article, I’ll guide you through a ...
    编程 发布于2024-11-02
  • 使用 Javascript 的哈希映射
    使用 Javascript 的哈希映射
    介绍 哈希映射(Hash Map),也称为哈希表(Hash Table),是一种实现关联数组抽象数据类型的数据结构,是一种可以将键映射到值的结构。 它使用哈希函数来计算存储桶或槽数组的索引,从中可以找到所需的值。 哈希映射的主要优点是它的效率。插入新的键值对、删除键值对以及查...
    编程 发布于2024-11-02
  • HTPX 简介:适用于 JavaScript 和 Node.js 的轻量级多功能 HTTP 客户端
    HTPX 简介:适用于 JavaScript 和 Node.js 的轻量级多功能 HTTP 客户端
    作为开发人员,我们的 Web 应用程序通常需要一个可靠且高效的 HTTP 客户端,无论我们是在浏览器中使用 JavaScript 还是在服务器端使用 Node.js 进行构建。这就是我创建 HTPX 的原因——一个强大的、轻量级的解决方案,旨在简化 HTTP 请求,同时为现代开发提供一系列功能。 在...
    编程 发布于2024-11-02

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3