8月4日
阿里开源项目启动框架Alpha
前面已经介绍了它的原理是基于PERT技术实现的。将一个项目过程以任务单元合理的安排资源,有些任务存在依赖关系所以执行顺序是定死的,但有些任务可以是脱离顺序,可以从关键任务路径中拎出来并行,从而一个项目的耗时及资源占比最大的任务即关键任务路径,在保证项目质量的前提下,可以对关键任务路径上的任务进行优化,也可以从次要任务优化,使关键任务资源充足,达到优化整体项目的效果。下面介绍关键代码类及点
Task
任务即项目的执行单元,任务包含的元素
- 任务的状态:空闲(idle),正在执行(runing),结束(finish),等待(wait)
- 任务优先级:线程是有限的,对于同一时机的任务,其执行顺序也是有先后顺序的
- 任务执行所在线程的优先级,对于优先级高的可以分配到更多的cpu时间
- 任务执行的线程:1.线程池子线程;2.主线程
- 任务名和任务的监听器对象集合
- 任务的关联关系:1.前驱任务集合,2.后继任务集合。执行顺序
- 当然可以添加监控器,监控任务的执行情况(任务耗时)
Project
项目即由多个任务组成的集合体,它本身也是一个任务,但有其特殊的属性和方法定义
- 定义了项目的生命周期,ProjectStart(),TaskFinish(),ProjectFinish()。项目的开始,项目中某任务的结束,项目的结束
- 定义开始和结束任务,两个任务是从图的执行角度来讲是唯一的起始和结束点,可以有效衡量一个图的开始和结束,并且方便将图插入另一个图中.startTask, finishTask
- 项目名称及生命周期监听集合
- 添加监控器,及项目执行性能统计
流程分析
- 初始化Project对象,定义startTask,finishTask,定义回调事件
- 添加任务,建立任务间的顺序关系
- 添加任务会与startTask与finishTask构成环形的有向图,每个任务会记录它的前驱任务集合和后继任务集合。当且仅当前驱任务执行完毕才会执行它自己,然后是后继任务,也就意味着,finnishTask只会在所有任务执行结束调用,最后的最后回调project的finish
项目意义
在项目中的实践,
- 可以应用于应用启动流程,在应用启动时会初始化很多任务,如数
据库,Tinker,图片库,缓存数据等等,这些任务或许可以同步执行
,但有些必须顺序执行。通过PERT技术恰恰能解释并优化这个过程 - 图片上传任务,数据上传等。数据多可以通过并发上传额方式充分利用cpu