芹菜似乎是一个很棒的工具,但是我很难理解各种芹菜组件如何一起工作:
- 工人
- 应用
- 任务
- 消息经纪(如兔子)
据我了解,命令行:
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()时会发生什么?哪个服务器首先与哪个服务器交谈?然后发送什么?
- 在芹菜命令的" -a"后面有什么选择?这真的需要吗?
- 假设我有一个进程X,可以实例化芹菜应用程序来启动任务A,并假设我还有另一个过程Y想要知道X启动的任务状态。我假设有一种方法可以做Y所以,但是我不知道如何。我想Y应该创建自己的芹菜应用程序实例。但是之后:
- 在Y芹菜应用程序中可以调用什么函数以获取此信息(在过程中,任务的"标识符"是什么? )?
- 这是如何在交流方面起作用的,也就是说,请求何时通过经纪人?
如果有人有一些有关这些问题的信息,我将不胜感激。我打算在Django项目中使用芹菜,其中一些对服务器的请求可以触发各种耗时的任务和/或查询先前启动的任务的状态(待定,完成,错误等...)。
关于经纪人:
经纪人的主要角色是调解客户与工人之间的沟通
基本上,当您的工人运行时,正在生成和处理很多信息
照顾这些信息是经纪人的角色
例如。您可以配置redis,以便在运行过程时关闭服务器
时不会丢失信息工人:
您可以将工人视为独立于您的应用程序的实例,这只会执行您委派给其的那些任务
关于任务的状态:
有多种方法可以咨询芹菜来找出任务的状态,但我不建议根据此
构建您的应用程序逻辑如果要获取一个进程的输出并将其在另一个任务的输入中转动,我建议您使用队列
- 运行任务A,然后完成之前,将结果对象插入队列
- 任务B将听取队列并处理任何出现的事情
命令:
在终端上,您可以通过运行celery -h
或celery --help
但该参数基本上指定您打算运行的芹菜实例。因此,通常此参数将指示您已配置并打算执行的实例
usage: celery [-h] [-A APP] [-b BROKER] [--result-backend RESULT_BACKEND]
[--loader LOADER] [--config CONFIG] [--workdir WORKDIR]
[--no-color] [--quiet]
我希望这可以为那些到达这里的人提供初始概述
芹菜用于使功能在后台运行。想象一下,您有一个可以完成工作的Web API,并返回响应。您知道,这项工作将严重影响API的响应时间。因此,您将把该特定的工作转移到芹菜中,您的API将立即做出反应。影响API表现的某些工作的示例是
- 路由到电子邮件服务器
- 路由到SMS网关
- 数据库备份
- 链接的数据库操作
- 文件转换
现在,让我们覆盖芹菜的每个成分。
-
工人芹菜工人执行工作(功能)。它们是异步的。因此,您将拥有芹菜工人的加工核心数量的两倍。您可以将姓名和任务分配给芹菜工人#
-
应用程序该应用是您正在从事的项目的名称。您必须在芹菜实例中指定该名称。
-
任务您需要在后台执行的功能。每个任务芹菜执行都将具有一个任务ID,状态(以及更多)。您可以通过检查特定任务来获得这一点。
-
消息经纪这些将在后台执行的任务必须从您的Python项目转移到芹菜工人。消息经纪人在这里充当媒介。因此,及其参数的功能将转移给经纪人,从经纪人芹菜将取得执行。
一些代码
celery -A project_name worker_name
celery -A project_name worker_name inspect
在文档中更多docs.celeryproject.org