任务处理方法和装置 【技术领域】
本发明涉及任务处理技术, 尤其涉及任务处理方法和装置。背景技术 在企业管理软件中, 存在大量的异步任务, 比如发送各种通知 ( 消息, 短信, 电子 邮件等 ), 执行某些自动动作 ( 自动调用服务等 )。随着用户压力的增加, 在短时间内会产 生大量的这些任务。已有的解决方法一般分为两种 : 一种是将这些任务排入一个先入先出 (FIFO) 队列, 然后一个个按顺序执行 ; 另外一种则是通过一个线程池, 多线程的将任务并 行执行。前者的优点是不会由于任务过多而占用大量的系统资源, 缺点是浪费了计算机并 行处理能力, 效率低下。后者的优点是尽可能的最大化利用了系统的并行计算能力, 但缺 点也很明显, 一方面由于同时执行的任务可能存在约束或竞争关系, 导致需要线程同步, 就 带来了额外的系统开销 ( 线程切换, 锁竞争等 ), 在任务之间约束和竞争关系比较多的情况 下, 反而会造成系统效率低下, 另一方面由于大部分线程池无法提供很好的伸缩性 ( 负载
可控 ), 造成大负载情况下对系统资源的过度占用, 极大的影响了用户体验。
因此, 需要一种任务处理方式, 能够最大限度地利用计算机的并行能力, 而又避免 由于任务之间的约束带来的线程同步, 耗费系统资源的问题。 发明内容
鉴于以上, 本发明的技术方案所要解决的技术问题在于, 提供一种任务处理方法 和装置, 能够最大限度地利用计算机的并行能力, 而又避免由于任务之间的约束带来的线 程同步, 耗费系统资源的问题。
本发明提供了一种任务处理方法, 包括 : 步骤 102, 接收输入的任务 ; 步骤 104, 判 断所述任务是否具有同步属性, 在所述任务具有同步属性时, 进入步骤 106, 在所述任务不 具有同步属性时, 进入步骤 110 ; 所述步骤 106, 根据所述任务的同步属性, 在当前执行任务 中查找所述任务对应的排他任务 ; 步骤 108, 在当前执行任务中存在所述任务对应的排他 任务时, 不执行所述任务, 直至所述当前执行任务中不存在所述任务对应的排他任务, 所述 步骤 110, 执行所述任务。通过该技术方案, 可以避免同时执行任务时由于相互竞争导致对 系统资源的争夺, 保证了执行任务的次序和效率, 合理利用计算机的系统资源。
在上述技术方案中, 优选地, 所述步骤 108 中, 在当前执行任务中存在所述任务对 应的排他任务时, 根据所述任务的同步属性, 将所述任务分配至对应的排他队列, 在所述当 前执行任务中不存在所述任务对应的排他任务时, 从所述任务对应的排他队列里取出所述 任务, 以待执行。
在上述技术方案中, 优选地, 排他队列中的所有任务均具有优先级, 从所述排他队 列中取出任务时, 先取出优先级最高的任务。通过该技术方案, 通过优先级调节, 保证了任 务执行的次序。
在上述技术方案中, 优选地, 在所述步骤 110 中, 所述任务通过线程池提供的线程执行。 在上述技术方案中, 优选地, 在所述步骤 110 中, 所述当前执行任务占用所述线程 池的所有线程时, 使所述任务进入等待状态, 直至所述线程池中存在空余线程, 使用所述空 余线程执行所述任务。通过该技术方案, 可以很好地控制系统的伸缩性。
在上述技术方案中, 优选地, 处于所述等待状态的所有任务均具有优先级, 在所述 线程池里仅出现一个空余线程时, 将所述一个空余线程用于执行优先级最高的任务。通过 该技术方案, 使得等待队列中的任务也具有优先级。
在上述技术方案中, 优选地, 所述步骤 108 中, 所述任务具有多个同步属性, 以及 在当前执行任务中存在对应任务的不同同步属性的多个排他任务, 根据所述不同同步属性 的优先程度, 将所述任务分配至优先程度最高的同步属性对应的排他队列, 排他队列包括 : 全局排他队列, 所述全局排他队列中的任务只能单独执行 ; 类别排他队列, 所述类别排他队 列中的任务不能与所述类别排他队列对应类型的任务同时执行。
通过上述技术方案, 通过实现同步队列将具有约束关系的任务进行同步排队, 避 免了任务之间的竞争, 然后利用优先级调节队列中任务的执行滞后性, 同时通过等待队列 和设置任务数可同时执行任务的最大数目, 使负载能力可控, 具有良好的系统伸缩性。
本发明还提供了一种任务处理装置, 包括 : 调度模块, 判断输入的任务是否具有同 步属性, 在所述任务具有同步属性时, 将所述任务提交至同步控制模块, 在所述任务不具有 同步属性时, 将所述任务提交至任务执行模块 ; 所述同步控制模块, 根据所述任务的同步属 性, 在当前执行任务中查找所述任务对应的排他任务, 并在所述当前执行任务中不存在所 述任务对应的排他任务时, 将所述任务通过所述调度模块提交至所述任务执行模块 ; 所述 任务执行模块, 执行所述任务。 通过该技术方案, 可以避免同时执行任务时由于相互竞争导 致对系统资源的争夺, 保证了执行任务的次序和效率, 合理利用计算机的系统资源。
在上述技术方案中, 优选地, 还包括 : 同步队列模块, 提供排他队列, 所述同步控制 模块在当前执行任务中存在所述任务对应的排他任务时, 根据所述任务的同步属性, 通过 所述同步队列模块将所述任务分配至对应的排他队列, 在所述当前执行任务中不存在所述 任务对应的排他任务时, 通过所述同步队列模块从所述任务对应的排他队列里取出所述任 务, 由所述调度模块将所述任务提交至所述任务执行模块, 以待执行。
在上述技术方案中, 优选地, 所述同步队列模块还供用户制定不同类型的排他队 列。通过该技术方案, 使得任务的处理更加灵活。
通过上述技术方案, 通过实现同步队列将具有约束关系的任务进行同步排队, 避 免了任务之间的竞争, 然后利用优先级调节队列中任务的执行滞后性, 同时通过等待队列 和设置任务数可同时执行任务的最大数目, 使负载能力可控, 具有良好的系统伸缩性。
附图说明 图 1 是根据本发明的一个实施例的任务处理方法的流程图 ;
图 2 是根据本发明的一个实施例的任务处理装置的框图 ;
图 3 是根据本发明的一个实施例的任务处理装置的功能模块示意图 ;
图 4 是根据本发明的一个实施例的任务处理装置的任务执行模块以状态机方式 工作的运行示意图 ; 以及
图 5 是根据本发明的一个实施例的任务处理方法的流程图。具体实施方式
为了能够更清楚地理解本发明的上述目的、 特征和优点, 下面结合附图和具体实 施方式对本发明进行进一步的详细描述。
在下面的描述中阐述了很多具体细节以便于充分理解本发明, 但是, 本发明还可 以采用其他不同于在此描述的其他方式来实施, 因此, 本发明并不限于下面公开的具体实 施例的限制。
图 1 是根据本发明的一个实施例的任务处理方法的流程图。
如图 1 所示, 根据本发明的实施例的任务处理方法包括 : 步骤 102, 接收输入的 任务 ; 步骤 104, 判断所述任务是否具有同步属性, 在所述任务具有同步属性时, 进入步骤 106, 在所述任务不具有同步属性时, 进入步骤 110 ; 所述步骤 106, 根据所述任务的同步属 性, 在当前执行任务中查找所述任务对应的排他任务 ; 步骤 108, 在当前执行任务中存在所 述任务对应的排他任务时, 不执行所述任务, 直至所述当前执行任务中不存在所述任务对 应的排他任务, 所述步骤 110, 执行所述任务。 通过这样的技术方案, 可以避免同时执行任务 时由于相互竞争导致对系统资源的争夺, 保证了执行任务的次序和效率, 合理利用计算机 的系统资源。 在上述技术方案中, 所述步骤 108 中, 在当前执行任务中存在所述任务对应的排 他任务时, 根据所述任务的同步属性, 将所述任务分配至对应的排他队列, 在所述当前执行 任务中不存在所述任务对应的排他任务时, 从所述任务对应的排他队列里取出所述任务, 以待执行。
在上述技术方案中, 排他队列中的所有任务均具有优先级, 从所述排他队列中取 出任务时, 先取出优先级最高的任务。这样, 通过优先级调节, 保证了任务执行的次序。
在上述技术方案中, 在所述步骤 110 中, 所述任务通过线程池提供的线程执行。
在上述技术方案中, 在所述步骤 110 中, 所述当前执行任务占用所述线程池的所 有线程时, 使所述任务进入等待状态, 直至所述线程池中存在空余线程, 使用所述空余线程 执行所述任务。因此, 可以很好地控制系统的伸缩性。
在上述技术方案中, 处于所述等待状态的所有任务均具有优先级, 在所述线程池 里仅出现一个空余线程时, 将所述一个空余线程用于执行优先级最高的任务。通过该技术 方案, 使得等待队列中的任务也具有优先级。
在上述技术方案中, 所述步骤 108 中, 所述任务具有多个同步属性, 以及在当前执 行任务中存在对应任务的不同同步属性的多个排他任务, 根据所述不同同步属性的优先程 度, 将所述任务分配至优先程度最高的同步属性对应的排他队列, 排他队列包括 : 全局排他 队列, 所述全局排他队列中的任务只能单独执行 ; 类别排他队列, 所述类别排他队列中的任 务不能与所述类别排他队列对应类型的任务同时执行。
通过上述技术方案, 通过实现同步队列将具有约束关系的任务进行同步排队, 避 免了任务之间的竞争, 然后利用优先级调节队列中任务的执行滞后性, 同时通过等待队列 和设置任务数可同时执行任务的最大数目, 使负载能力可控, 具有良好的系统伸缩性。
图 2 是根据本发明的一个实施例的任务处理装置的框图。
如图 2 所示, 根据本发明的实施例的任务处理装置 200 包括 : 调度模块 202, 判断 输入的任务是否具有同步属性, 在所述任务具有同步属性时, 将所述任务提交至同步控制 模块, 在所述任务不具有同步属性时, 将所述任务提交至任务执行模块 ; 所述同步控制模 块 204, 根据所述任务的同步属性, 在当前执行任务中查找所述任务对应的排他任务, 并在 所述当前执行任务中不存在所述任务对应的排他任务时, 将所述任务通过所述调度模块提 交至所述任务执行模块 ; 所述任务执行模块 206, 执行所述任务。通过这样的技术方案, 可 以避免同时执行任务时由于相互竞争导致对系统资源的争夺, 保证了执行任务的次序和效 率, 合理利用计算机的系统资源。
在上述技术方案中, 还可以包括 : 同步队列模块, 提供排他队列, 所述同步控制模 块在当前执行任务中存在所述任务对应的排他任务时, 根据所述任务的同步属性, 通过所 述同步队列模块将所述任务分配至对应的排他队列, 在所述当前执行任务中不存在所述任 务对应的排他任务时, 通过所述同步队列模块从所述任务对应的排他队列里取出所述任 务, 由所述调度模块将所述任务提交至所述任务执行模块, 以待执行。
在上述技术方案中, 所述同步队列模块还供用户制定不同类型的排他队列。 因此, 使得任务的处理更加灵活。 通过上述技术方案, 通过实现同步队列将具有约束关系的任务进行同步排队, 避 免了任务之间的竞争, 然后利用优先级调节队列中任务的执行滞后性, 同时通过等待队列 和设置任务数可同时执行任务的最大数目, 使负载能力可控, 具有良好的系统伸缩性。
图 3 是根据本发明的一个实施例的任务处理装置的功能模块示意图。
如图 3 所示, 调度控制模块 302( 相当于图 2 实施例中的调度模块 202) : 作为中央 控制模块, 通过协调同步控制模块 304 和任务执行模块 306 控制任务的同步和执行。
同步控制模块 304 : 负责同步任务的同步控制 ( 出入队 ), 并根据同步状态提供可 执行任务。
任务执行模块 306 : 以状态机的模式负责任务的具体执行。状态机如图 4 所示, 分 为三种状态 : 空闲 (Idle), 可运行 (Running), 已满载 (Overflow)。
同步队列模块 308 : 同步策略的具体实现, 可提供多种同步策略, 如排他同步, 类 别同步等, 通过队列的方式实现各种同步行为。
等待队列模块 312 : 为可执行的任务提供伸缩性支持。
优先级控制模块 310 : 以优先队列的方式负责为同步队列和等待队列提供优先级 控制。
其中, 图 4 是根据本发明的一个实施例的任务处理装置的任务执行模块以状态机 方式工作的运行示意图。Idle 状态即表明任务执行模块 306 无任何任务在执行, 当有任务 派发过来时即转化为 Running 状态, Running 状态即表明有任务在任务执行模块 306 运行, 但还有空余线程可用, 当正在运行的任务已达最大数目 Running 状态即转化为 Overflow 状态, 处于 Idle 或 Running 状态下, 任务执行模块 306 收到派发的任务后将立即执行, 处 于 Overflow 状态下, 将任务入队到等待队列模块 312( 这样就可以很好的控制系统的伸缩 性 ), 直到当前某个执行的任务完成后, 状态又将重新转化为 Running 状态, 然后从等待队 列中出队任务进行执行, 同样, 当任务全部完成, 状态又将转化为 Idle 状态, 循环往复执 行; 任务的执行是在操作系统线程池上, 因此任务的执行和整个调度过程是异步的, 不会阻
塞调度线程, 同时用户可以通过任务执行模块 306 动态指定系统执行任务的最大数目。
图 5 是根据本发明的一个实施例的任务处理方法的流程图。
如图 5 所示, 在步骤 502, 输入需要处理的任务。
在步骤 504, 以时间间隔的方式通过接口或查询数据源获得一批任务, 根据任务的 属性判断是否将任务进行同步控制, 是则进入步骤 506, 否则进入步骤 518。
在步骤 506, 将任务进行同步控制。
在步骤 508, 根据任务的属性判断是否为排他同步, 是则进入步骤 510, 否则进入 步骤 512。
在步骤 510, 将任务排入全局排他队列。
在步骤 512, 判断任务是否为类别同步, 是则进入步骤 514, 否则进入步骤 516。
在步骤 514, 将任务排入类别同步队列。
在步骤 516, 将任务进行其他同步处理。
在步骤 518, 将任务派送并执行。
在步骤 520, 判断任务是否处于可执行状态, 是则进入步骤 522, 否则进入步骤 524。 在步骤 522, 将任务排入等待队列。
在步骤 524, 按照图 4 所示的运行流程, 执行该任务。
在这里, 需要说明的是, 将入队任务进行同步控制时, 使用不同的同步策略的队列 来控制任务的同步等待。 同步队列包括 : 全局排他队列, 指的是该类任务在一台计算机上在 同一时间只能单独执行, 不允许其他任务同时执行, 进入条件为只要当前正在执行的任务 中有全局排他任务, 其他任务就必须进入该队列进行同步等待 ; 类别排他队列, 指的是按照 用户定义的某种分类, 只要属于该分类的任务在当前系统执行, 那么就必须进入该分类的 队列进行同步等待。 其他同步队列, 指的是由于本发明具有扩展性, 用户可以定义具有其他 同步策略的队列。
任一个同步队列的实现都遵循如下规则 :
1. 队列分为两种状态 : a) 就绪状态 b) 同步状态 ;
2. 处于就绪状态下, 可以进行入队操作, 也可以进行出队操作, 如果是出队操作队 列状态转化为同步状态 ;
3. 处于同步状态下, 可以入队, 但不能出队, 如果收到同步控制信号, 队列状态转 换为就绪状态 ;
通过如上规则, 从抽象的角度定义了同步的语义, 而把每个任务具体需要与哪个 或哪类任务同步留给了各个队列去具体实现。通过遍历处于就绪状态同步队列, 对其进行 出队操作, 得到的任务排队即为可执行任务列表。
需要注意的是, 在混合同步模式下, 即该任务可能需要通过多个同步队列进行同 步控制时, 可能会丧失一部分时序上的优先, 导致任务执行滞后。如某任务 A 先进入全局排 他队列, 一分钟后某任务 B 紧接着直接进入类别同步队列, 假设任务 A 和 B 在任务本身的优 先级别上是一致的, 那么现在任务 A 在时序上要提前于任务 B, 按照时序优先的原则, 任务 A 应该优先于任务 B, 然后全局排他队列接到同步通知释放任务 A, 任务 A 接着进入类别同步 队列 ( 晚于任务 B 进入该队列的时间 ), 这时为了保障任务 A 的执行顺序领先于任务 B, 就
将通过优先级控制提高任务 A 的优先级别。同样的, 等待队列中的任务在经过了同步控制 之后也丧失了时序上的优先, 同样为了解决此问题, 等待队列也需要调节优先级。
另外, 当一个任务执行完之后, 该任务所在的线程将回调并通知该任务的结束同 步, 接到通知后, 按该任务的属性找到该任务对应的同步队列, 然后通知该队列结束同步, 导致同步队列状态发生改变, 接着再检索处于就绪状态的队列返回可执行任务列表, 再将 这些任务进行任务执行, 重复图 4 所示的执行方法。
通过上述技术方案, 可以实现一种任务处理方法和装置, 其具有下列优点 :
1. 将有约束关系的任务进行排队, 使其按顺序执行, 避免了同时执行时由于相互 竞争导致对系统资源的争夺, 既达到了同步的目的, 同时又提高了系统效率。
2. 可扩展的可混合的多阶段同步队列实现方法, 可以支持多种同步队列并且混合 使用, 同时通过优先级调节保证了任务执行的次序问题。
3. 利用设置最大任务数和等待队列, 通过排队的方式来控制系统的伸缩性, 使负 载能力可控, 能更合理的利用计算机的系统资源。
4. 提出基于状态机模式的任务执行方法, 相对于传统的通过一个轮询线程间隔的 从队列获取任务, 由于其不需要轮询线程, 其可靠性和效率都大幅提高。
以上所述仅为本发明的优选实施例而已, 并不用于限制本发明, 对于本领域的技 术人员来说, 本发明可以有各种更改和变化。 凡在本发明的精神和原则之内, 所作的任何修 改、 等同替换、 改进等, 均应包含在本发明的保护范围之内。