Celery:了解大局

Arc*_*ain 5 python celery celery-task django-celery

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

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

据我了解,命令行:

celery -A not-clear-what-this-option-is worker
Run Code Online (Sandbox Code Playgroud)

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

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

app = Celery('my_module', broker='pyamqp://guest@localhost//')
Run Code Online (Sandbox Code Playgroud)

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

@app.tasks
def my_func():
    ...
Run Code Online (Sandbox Code Playgroud)

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

这是我的问题:

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

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

Gui*_*rme 1

关于经纪人:

经纪人的主要作用是调解客户和工人之间的沟通

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

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

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

工人:

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

关于任务的状态:

有多种方法可以咨询 celery 来找出任务的状态,但我不建议根据此构建应用程序逻辑

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

  • 运行任务 A,并在完成之前将结果对象插入队列中
  • 任务 B 将监听队列并处理出现的任何情况

命令:

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

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

usage: celery [-h] [-A APP] [-b BROKER] [--result-backend RESULT_BACKEND]
              [--loader LOADER] [--config CONFIG] [--workdir WORKDIR]
              [--no-color] [--quiet]
Run Code Online (Sandbox Code Playgroud)

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