【问题标题】:Celery : understanding the big picture芹菜:了解大局
【发布时间】:2017-07-27 01:34:18
【问题描述】:

Celery 似乎是一个很棒的工具,但我很难理解各种 Celery 组件如何协同工作:

  • 工人
  • 应用程序
  • 任务
  • 消息代理(如 RabbitMQ)

据我了解,命令行:

celery -A not-clear-what-this-option-is worker

应该运行某种芹菜“工作服务器”,它本身需要连接到代理服务器(我不太确定为什么需要这么多服务器)。

然后在任何 python 代码中,可能会通过实例化应用程序将某些任务发送给工作人员:

app = Celery('my_module', broker='pyamqp://guest@localhost//')

然后通过以下方式使用此应用程序装饰功能:

@app.tasks
def my_func():
    ...

现在可以将“my_func()”称为“my_func.delay()”以异步方式运行。

这是我的问题:

  • 调用 my_func.delay() 时会发生什么?哪个服务器先与哪个对话?并将什么发送到哪里?
  • celery 命令的“-A”后面的选项是什么?这真的需要吗?
  • 假设我有一个进程 X,它实例化一个 Celery 应用程序来启动任务 A,并假设我有另一个进程 Y 想知道 X 启动的任务 A 的状态。我假设 Y 有办法做所以,但我不知道如何。我想 Y 应该创建自己的 Celery 应用程序实例。但是之后:
    • 在 Y 的 celery 应用程序中调用什么函数来获取此信息(以及进程 Y 中任务 A 的“标识符”是什么)?
    • 这在通信方面是如何工作的,即请求什么时候通过 Broker,什么时候到达 worker?

如果有人能提供有关这些问题的一些信息,我将不胜感激。我打算在 Django 项目中使用 Celery,其中对服务器的一些请求可能会触发各种耗时的任务,和/或查询之前启动的任务的状态(待处理、已完成、错误等)。

【问题讨论】:

  • 因为这已经 +3 年了,你可能已经想出了自己的答案,但我认为留下一些答案很重要

标签: python celery django-celery celery-task


【解决方案1】:

Celery 用于使函数在后台运行。想象一下,您有一个执行工作并返回响应的 Web API。你知道,这项工作会严重影响 API 的响应时间。所以你将把那个特定的工作转移到 Celery,你的 API 会立即响应。一些影响 API 性能的作业的示例是,

  • 路由到电子邮件服务器
  • 路由到 SMS 网关
  • 数据库备份
  • 链式数据库操作
  • 文件转换

现在,让我们介绍一下芹菜的各个组成部分。

  • 工人 芹菜工人执行工作(功能)。它们是异步的。因此,您将拥有双倍的处理器内核数量作为 celery worker。您可以为 celery worker 分配名称和任务#。

  • 应用程序 该应用程序是您正在处理的项目的名称。您必须在 celery 实例中指定该名称。

  • 任务 您需要在后台执行的功能。 Celery 执行的每个任务都会有一个任务 ID、状态(等等)。您可以通过检查特定任务来获得它。

  • 消息代理 那些将在后台执行的任务必须从你的 python 项目转移到 Celery 工作人员。消息代理在这里充当媒介。因此,带有参数的函数将被转移到代理,并且 Celery 将从代理获取它们以执行。

一些代码

celery -A project_name worker_name
celery -A project_name worker_name inspect

文档中的更多内容 docs.celeryproject.org

【讨论】:

    【解决方案2】:

    关于经纪人:

    broker的主要作用是调解client和worker之间的通信

    基本上,在您的工作器运行时会生成和处理大量信息

    处理这些信息是经纪人的职责

    例如您可以配置redis,以便在运行进程时关闭服务器时不会丢失任何信息

    工人:

    您可以将工作人员视为独立于您的应用程序的实例,它只会执行您委托给它的那些任务

    关于任务的状态:

    有一些方法可以咨询 celery 以了解任务的状态,但我不建议根据此构建应用程序逻辑

    如果你想获取一个进程的输出并将其作为另一个进程的输入,使用任务,我建议你使用队列

    • 运行任务 A,然后在完成之前将结果对象插入队列中
    • 任务 B 将侦听队列并处理出现的任何内容

    命令:

    在终端上,您可以通过运行 celery -hcelery --help 更详细地查看每个参数的含义

    但参数基本上指定了您打算运行的 celery 实例。所以通常这个参数会指出你已经配置并打算执行的实例在哪里可以找到

    usage: celery [-h] [-A APP] [-b BROKER] [--result-backend RESULT_BACKEND]
                  [--loader LOADER] [--config CONFIG] [--workdir WORKDIR]
                  [--no-color] [--quiet]
    

    我希望这可以为那些到达这里的人提供一个初步的概述

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 2020-01-04
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      相关资源
      最近更新 更多