8月4日

阿里开源项目启动框架Alpha

前面已经介绍了它的原理是基于PERT技术实现的。将一个项目过程以任务单元合理的安排资源,有些任务存在依赖关系所以执行顺序是定死的,但有些任务可以是脱离顺序,可以从关键任务路径中拎出来并行,从而一个项目的耗时及资源占比最大的任务即关键任务路径,在保证项目质量的前提下,可以对关键任务路径上的任务进行优化,也可以从次要任务优化,使关键任务资源充足,达到优化整体项目的效果。下面介绍关键代码类及点

Task

任务即项目的执行单元,任务包含的元素

  1. 任务的状态:空闲(idle),正在执行(runing),结束(finish),等待(wait)
  2. 任务优先级:线程是有限的,对于同一时机的任务,其执行顺序也是有先后顺序的
  3. 任务执行所在线程的优先级,对于优先级高的可以分配到更多的cpu时间
  4. 任务执行的线程:1.线程池子线程;2.主线程
  5. 任务名和任务的监听器对象集合
  6. 任务的关联关系:1.前驱任务集合,2.后继任务集合。执行顺序
  7. 当然可以添加监控器,监控任务的执行情况(任务耗时)

Project

项目即由多个任务组成的集合体,它本身也是一个任务,但有其特殊的属性和方法定义

  1. 定义了项目的生命周期,ProjectStart(),TaskFinish(),ProjectFinish()。项目的开始,项目中某任务的结束,项目的结束
  2. 定义开始和结束任务,两个任务是从图的执行角度来讲是唯一的起始和结束点,可以有效衡量一个图的开始和结束,并且方便将图插入另一个图中.startTask, finishTask
  3. 项目名称及生命周期监听集合
  4. 添加监控器,及项目执行性能统计

流程分析

  1. 初始化Project对象,定义startTask,finishTask,定义回调事件
  2. 添加任务,建立任务间的顺序关系
  3. 添加任务会与startTask与finishTask构成环形的有向图,每个任务会记录它的前驱任务集合和后继任务集合。当且仅当前驱任务执行完毕才会执行它自己,然后是后继任务,也就意味着,finnishTask只会在所有任务执行结束调用,最后的最后回调project的finish

项目意义

在项目中的实践,

  1. 可以应用于应用启动流程,在应用启动时会初始化很多任务,如数
    据库,Tinker,图片库,缓存数据等等,这些任务或许可以同步执行
    ,但有些必须顺序执行。通过PERT技术恰恰能解释并优化这个过程
  2. 图片上传任务,数据上传等。数据多可以通过并发上传额方式充分利用cpu

项目地址