任务调度框架(多任务、动态优先级调度)

背景

日常开发的过程中,对于某个状态变更的监听,一般都是使用注册listener的方式,在状态变更的时候,遍历注册的listener一一进行通知,这种情况,经常会出现一些任务扎堆执行的情况,譬如登录完成(或者其他类似的通知监听),如果一个APP里面有很多的业务,每个模块都注册了监听,在登录状态变更的时候,会去获取更新数据或者干一些业务相关的逻辑。这种情况下这种实现方式会存在以下几个问题:

1、通知无优先级概念,A场景触发的登录,并不能优先处理A场景的状态变更;
2、导致瞬间UI线程繁忙,极端情况下会导致丢帧、卡顿;
3、通知之后的业务执行不可控,出现问题的时候,很难定位是什么原因导致的。

因此想写一个框架来解决这种问题。

职责

1、负责所有注册任务的调度,
2、利用线程池技术,增加吞吐量,让任务都能够尽快执行;
3、有优先级概念,A触发的场景,优先处理A场景的任务;
4、解决扎堆执行可能导致的丢帧、卡顿问题。

怎样做?

1、任务存在优先级:priority
2、支持不同的调度策略
3、支持动态更改优先级;

如果任务是一次性的,那在一开始添加任务的时候,我们根据不同的业务重要优先级确定任务的优先级即可(譬如启动完成)。但还有另外一种类型的任务,是在运行过程中会多次执行的,由于任务是一开始就添加的,需要在其他的场景再次进行sort,怎样做才能够让任务动态的优先级动态变更呢?

一开始注册的时候,按照时间戳作为优先级的大小;然后在A场景开始触发任务调度的时候,更新A场景对应的任务的priority为当前时间。这样子A场景对应的任务就可以在新一轮调度中,最高优执行。

4、任务的执行,可以在调度框架的线程池里面执行。
5、任务的执行,能够获取到对应的执行时间,进行监控
多任务多线程管理模块,任务优先级,一个任务执行完毕,按照优先级高低执行另一个任务 1)如何使用: 1. 声明一个HashTaskList,或在栈上动态获取; 2. 调用InitTaskList初始化上一步的HashTaskList 3. 调用StartTaskManager开始启动任务管理 ***** 对于一个HashTaskList而言,以上2个函数只调用一次 4. 调用ApplyTask向第一步得到的结构对象添加任务,每调用一次添一个任务 2)如何终止任务管理功能: 1. 程序结束,终止程序既停止管理并且释放所有资源,请看2).2括号的内容 2. 调用某个函数,这个功能未写(考虑到模块作为服务运行,不需要终止任务管理的函数) 需要取消所有1v1管理线程,在此需要一个列表保存这些线程的ID 需要清理表当中的互斥锁和信号变量,如果1).1.是动态分配,要释放 3)关于改进: 1. 回收资源的线程和TaskList reclaim[LEVEL_ARRAY_LIMIT];是可以省掉的 但考虑到模块功能的延伸: 如果任务执行失败,先移动到某个地方,过段时间在放回来重试,等等... 其实还有很多可能用到它的地方...所以,依旧保留 2. 有多少个任务可以并发管理目前是固定的 其实可添加一个对StartTaskManager所生成的线程管理的数据结构 这样就能动态的增加或减少任务管理的1v1线程 ***** 可事实上我并不想做这个管理的东西在里面 ***** 没有必要,对提供服务的程序而言这东西一般是固定不变的 ********************************************* 1) How to use: 1. Declare a HashTaskList, or dynamic access stack; 2. Call the initialization of step HashTaskList InitTaskList
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值