本文环境python3.5.2,celery 4.3.0系列
celery的启动过程中涉及多个模块,各个模块之间又存在着依赖关系,那么如何按照依赖关系启动各个模块,celery设计了一套简单的DAG(有向无环图),本文就主要分析一下celery DAG的实现过程。
celery 中各个模块定为step
- Worker
- Timer:用于执行定时任务的 Timer,和 Consumer 那里的 timer 不同
- Hub:Eventloop 的封装对象(回顾一下 Kombu 的)
- Pool:构造各种执行池(线程/进程/协程)的
- Autoscaler:用于自动增长或者 pool 中工作单元
- StateDB:持久化 worker 重启区间的数据(只是重启)
- Autoreloader:用于自动加载修改过的代码
- Beat:创建 Beat 进程,不过是以子进程的形式运行(不同于命令行中以 beat 参数运行)
worker初始化过程中,各个模块的执行顺序是由一个BluePrint类定义,并且根据各个模块之间的依赖进行排序执行。
class Blueprint(bootsteps.Blueprint):
"""Worker bootstep blueprint."""
name = 'Worker'
default_steps = {
'celery.worker.components:Hub',
'celery.worker.components:Pool',
'celery.worker.components:Beat',
'celery.worker.components:Timer',
'celery.worker.components:StateDB',
'celery.worker.components:Consumer',
'celery.worker.autoscale:WorkerComponent',
}