芹菜:了解大局

时间:2017-03-07 00:41:40

标签: python celery django-celery celery-task

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

  • 工人
  • 应用
  • 任务
  • 消息Broker(如RabbitMQ)

据我所知,命令行:

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

应该运行某种芹菜"工作服务器"本身需要连接到代理服务器(我不太清楚为什么需要这么多服务器)。

然后在任何python代码中,可以通过实例化app来向工作人员发送一些任务:

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

然后通过以下方式使用此应用程序修饰函数:

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

这样" my_func()"现在可以被称为" my_func.delay()"以异步的方式运行。

以下是我的问题:

  • 调用my_func.delay()时会发生什么?哪个服务器首先会谈?并发送什么地方?
  • 放置" -A"的选项是什么?芹菜命令?这真的需要吗?
  • 假设我有一个进程X,它实例化一个Celery应用程序来启动任务A,并假设我有另一个进程Y谁想知道X发起的任务A的状态。我假设Y有办法做所以,但我不知道如何。我想Y应该创建自己的Celery应用程序实例。但是之后:
    • 在Y的芹菜应用程序中调用什么函数来获取此信息(以及过程Y中任务A的"标识符"是什么?)
    • 这在沟通方面如何运作,也就是说,请求何时通过经纪人,何时进入工人?

如果有人对这些问题有任何了解,我将不胜感激。我打算在Django项目中使用Celery,其中对服务器的一些请求可以触发各种耗时的任务,和/或查询先前启动的任务的状态(挂起,完成,错误等等)。

2 个答案:

答案 0 :(得分:0)

关于经纪人:

broker 的主要作用是调解客户端和 worker 之间的通信

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

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

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

工作人员:

您可以将 worker 视为独立于您的应用程序的实例,它只会执行您委托给它的任务

关于任务的状态:

有一些方法可以通过 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]

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

答案 1 :(得分:0)

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

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

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

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

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

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

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

一些代码

celery -A project_name worker_name
celery -A project_name worker_name inspect

更多文档 docs.celeryproject.org