TaskPool
1、TaskPool概念及工作原理
1.1、TaskPool概念
任务池(TaskPool)作用是为应用程序提供一个多线程的运行环境,降低整体资源的消耗、提高系统的整体性能,且无需关心线程实例的生命周期,它支持任务组TaskGroup
、任务优先级设置、取消任务等功能,且可以根据任务数量进行自动的扩容与缩容,还可以根据任务优先级进行任务调度。
1.2、TaskPool工作机制
TaskPool工作原理可以用下图表示
TaskPool支持开发者在宿主线程封装任务抛给任务队列,系统选择合适的工作线程,进行任务的分发及执行,再将结果返回给宿主线程。系统默认会启动一个任务工作线程,当任务较多时会扩容,工作线程数量上限跟当前设备的物理核数相关,具体数量内部管理,保证最优的调度及执行效率,长时间没有任务分发时会缩容,减少工作线程数量。具体来说就是: 在主线程(ArkTS Main Thread)中调用TaskPool的execute接口会将待执行的任务方法及参数信息,根据设置的任务优先级放入任务队列(TaskQueue
)中等待调度执行。调度器会依据调度算法(优先级,防饥饿),从优先级队列中取出任务进行序列化,放入TaskPool中的Worker线程池,工作线程(ArkTS Worker Thread)根据调度器的安排执行任务方法,并将任务处理结果进行反序列化,最终以Promise-Then的方式返回给主线程。TaskPool的工作线程池会根据待执行的任务数量,任务的执行时间进行相应的扩容与缩容。原理图如下所示:
2、TaskPool用法入门
2.1、execute(task:Task)执行单个Task
通过execute(task:Task)
将待执行的函数放入TaskPool内部任务队列, 函数不会立即执行,而是等待分发到工作线程执行。当前执行模式不可取消任务。
//实现任务的函数需要使用@Concurrent装饰器标注,且仅支持在.ets文件中使用。
@Concurrent
function printArgs(args: number): number {
console.info("printArgs: " + args);
return args;
}
taskpool.execute(printArgs, 100).then((value: Object) => {
// 100: test number
console.info("taskpool result: "