它是运行Celery的实际处理器还是另一个进程?在flower中,我可以在一个工人池中看到多个过程?这两者之间有什么区别?
当您运行一个芹菜工作者时,它会创建一个父进程来管理正在运行的任务。这个过程处理记账功能,如发送/接收队列消息、注册任务、杀死挂起的任务、跟踪状态等。
然后,该进程生成N个实际执行单个任务的辅助进程。该数字由启动辅助程序时的-c
参数确定:http://docs.celeryproject.org/en/latest/userguide/workers.html#concurrency
子进程可以使用多种策略来实现,并且在使用-P
参数启动工作进程时进行配置。可能的值包括:prefork、eventlet、gevent、threads/solo。
原来Celery节点是间接记录在这里的:
https://docs.celeryproject.org/en/latest/reference/celery.bin.multi.html#celery.bin.multi.MultiTool.MultiParser.Node
简而言之,Celery在构建分布式工作系统时使用了一组有助于理解的术语。
- 客户端-希望看到工作完成的应用程序
- Worker-完成工作的应用程序
有助于计划的术语包括:
- 经纪人-客户要求工人工作的方式
- Application-Celery类的一个实例
在这一点上,请注意,Client、Broker和Worker都可以在不同的机器上,事实上,只要它们使用相同的Broker,就可以在不同机器上有多个Client和多个Worker。
因此,应用程序通常使用URL配置Broker也就不足为奇了。也就是说,所有的应用程序、所有的客户端和Worker都在使用相同的Broker URL,因此都在使用同一个Broker。
客户端通过代理发送(生成)消息,请求运行任务,Worker读取(使用)这些消息。
现在这些术语都有了一席之地:
- 执行池
- 群集
- 节点
通过维护一个执行池,每个Worker可以同时处理多个任务。这个池可能是线程,或者(默认情况下)它是子进程。因此,Worker可能有许多Pool进程作为子进程。
Celery的一个挫折(我有)是,你可以自由地与Workers通信,但不能与Worker的执行池中正在运行的任务通信(因此,我正在为交互式任务创建一个新的Task类,但它仍在发展中)。
节点只是集群中的一个辅助节点。简而言之,Node=Worker。集群是指并行运行的多个Worker(根据我介绍的文档,使用celery multi
)。集群只是在同一台机器上启动、停止和管理多个工人的一种方便方式。
可能有许多集群都使用来自同一Broker的任务,它们可能在同一台机器上(尽管人们会想知道为什么)或在不同的机器上。
这就是芹菜节点。。。(在最充分的背景下)。