Celery源码分析(二)--------任务执行单元Worker的流程
2016-12-25 21:53
507 查看
上一节中讲到通过命令行构造"celery.apps.worker::Worker"对象,然后就调用Worker对象的start方法启动Worker.
因此,这个Worker对象是一个核心对象,下面着重对其分析。
下面是Worker对象构造函数和start函数的时序图,对照流程图分析:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/25/45187d0b355284691a7d17b67970de25)
1.首先,调用AppLoader的init_worker方法,这个方法主要是根据配置加载一些需要的模块。
2.然后是on_before_init,这个主要是调用trace模块的setup_worker_optimizations方法。
这个方法主要做3件事:
a.为"BaseTask"安装栈保护。其实就是对__call__方法打个补丁。
b.然后调用Celery的'set_current'方法设置当前的app对象。
c.最后调用Celery的finalize方法,绑定所有的task任务到app对象。(包括系统自带的和我们自己编写的任务)
3.调用setup_defaults方法设置一些参数的默认值。
4.调用setup_instance方法初始化一些对象,主要做以下事情:
a.调用setup_queues,分别通过select,deselect设置amqp关注和不关注的队列,如果配置了CELERY_WORK_DIRECT,则通过调用select_add向关注队列中添加对应的队列。我们知道celery默认使用amqp协议的rabbitMQ做为broker.
b.调用setup_includes安装一些通过'CELERY_INCLUDE'配置的模块,保证所有的任务模块都导入了。
c.创建一个Blueprint对象,这个对象比较重要,从名字上来看是蓝图的意思,它会包含许多步骤对象,这些步骤之间通过有向无环图来建立依赖关系,用于根据依赖关系依次调用。后面还会专门分析。
我们先看一下Worker的Blueprint中都包含哪些步骤:
d.调用Blueprint的apply方法。完成Blueprint中每个步骤对象的构造和初始化。
5.调用Worker的start方法,这个方法主要是调用Blueprint的start方法启动Blueprint.
这样就分析完了Worker对象的构造和start方法,下一节将会对Blueprint做详细分析。
因此,这个Worker对象是一个核心对象,下面着重对其分析。
下面是Worker对象构造函数和start函数的时序图,对照流程图分析:
1.首先,调用AppLoader的init_worker方法,这个方法主要是根据配置加载一些需要的模块。
2.然后是on_before_init,这个主要是调用trace模块的setup_worker_optimizations方法。
这个方法主要做3件事:
a.为"BaseTask"安装栈保护。其实就是对__call__方法打个补丁。
b.然后调用Celery的'set_current'方法设置当前的app对象。
c.最后调用Celery的finalize方法,绑定所有的task任务到app对象。(包括系统自带的和我们自己编写的任务)
3.调用setup_defaults方法设置一些参数的默认值。
4.调用setup_instance方法初始化一些对象,主要做以下事情:
a.调用setup_queues,分别通过select,deselect设置amqp关注和不关注的队列,如果配置了CELERY_WORK_DIRECT,则通过调用select_add向关注队列中添加对应的队列。我们知道celery默认使用amqp协议的rabbitMQ做为broker.
b.调用setup_includes安装一些通过'CELERY_INCLUDE'配置的模块,保证所有的任务模块都导入了。
c.创建一个Blueprint对象,这个对象比较重要,从名字上来看是蓝图的意思,它会包含许多步骤对象,这些步骤之间通过有向无环图来建立依赖关系,用于根据依赖关系依次调用。后面还会专门分析。
我们先看一下Worker的Blueprint中都包含哪些步骤:
default_steps = set([ 'celery.worker.components:Hub', 'celery.worker.components:Queues', 'celery.worker.components:Pool', 'celery.worker.components:Beat', 'celery.worker.components:Timer', 'celery.worker.components:StateDB', 'celery.worker.components:Consumer', 'celery.worker.autoscale:WorkerComponent', 'celery.worker.autoreload:WorkerComponent', ])
d.调用Blueprint的apply方法。完成Blueprint中每个步骤对象的构造和初始化。
5.调用Worker的start方法,这个方法主要是调用Blueprint的start方法启动Blueprint.
这样就分析完了Worker对象的构造和start方法,下一节将会对Blueprint做详细分析。
相关文章推荐
- Celery源码分析(一)-------------从命令执行到生成Worker
- Hadoop源码流程分析4-Task节点执行任务
- 传奇源码分析-客户端(全局变量与总体执行流程)
- Java程序员从笨鸟到菜鸟之(四十)细谈struts2(四)struts2中action执行流程和源码分析
- PHP yii 框架源码阅读(二) - 整体执行流程分析
- struts2(四)struts2中action执行流程和源码分析
- Struts2学习(第四篇)——struts2中action执行流程和源码分析
- 微软AJax.net源码初步分析(2)--服务执行流程
- Tor源码分析九 -- 客户端执行流程(网络信息的下载)
- MapReduce执行过程源码分析(一)——Job任务的提交
- 传奇源码分析-客户端(全局变量与总体执行流程)
- angularjs源码分析之:angularjs执行流程
- Java程序员从笨鸟到菜鸟之(四十)细谈struts2(四)struts2中action执行流程和源码分析
- Android源码分析(一):android原生源码编译期间执行的流程
- Zookeeper源码分析(3)- Leader执行流程
- Hadoop0.21.0源码流程分析(3)-Task节点管理启动任务
- Nginx 源码分析-- 模块module 解析执行 nginx.conf 配置文件流程分析 一
- Tor源码分析四 -- 客户端执行流程(初入主循环)
- Spark Core源码分析: Spark任务执行模型
- Zookeeper源码分析(4)- Follower执行流程