zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【Kotlin 协程】协程底层实现 ② ( 协程调度器 | 协程任务泄漏 | 结构化并发 )

Kotlin并发 实现 任务 调度 底层 协程 泄漏
2023-09-14 09:07:26 时间





一、协程调度器



协程 是在 调度器 中运行的 , 在协程中有 3 种调度器 :

  • Dispatchers.Main 调度器 :主线程 中运行 , 处理 UI 交互任务 ; 使用场景如 : 调用 挂起 suspend 函数 , 更新 UI , 更新 LiveData ;
  • Dispatchers.IO 调度器 :子线程 中运行 , 处理 文件操作 和 网络 IO 操作 ; 使用场景如 : 数据库增删查改 , 文件读写处理 , 网络数据处理 ;
  • Dispatchers.Default 调度器 :子线程 中运行 , 处理 CPU 耗时任务 , 主要侧重算法消耗 ; 使用场景 : 数据排序 , 数据解析 , 数据对比 等耗时算法操作 ;

这里特别注意 , 在协程中调用 挂起 suspend 函数 , 必须在 Dispatchers.Main 调度器中执行 ;

Dispatchers.IO 调度器 和 Dispatchers.Default 调度器 都是在子线程 中执行耗时任务 , 但是在取消任务方面 , 磁盘或网络操作 与 CPU 密集型操作 是不同的 , 需要采用不同的任务取消策略 , 因此这里将耗时任务分配成两种调度器 ;





二、协程任务泄漏



协程任务泄漏 : 发起 协程任务 后 , 无法追踪任务的执行结果 , 任务等于无效任务 , 但是仍然会消耗 内存 , CPU , 网络 , 磁盘 等资源 ;

Kotlin 中引入了 结构化并发机制 避免 协程任务泄漏 的情况发生 ;


协程任务泄漏 与 内存泄漏 类似 ;





三、结构化并发



结构化并发 使用场景 :

  • 协程任务取消 : 在不需要协程任务的时候 , 取消协程任务 ;
  • 追踪协程任务 : 追踪正在执行的协程任务 ;
  • 发出错误信号 : 如果 协程任务执行失败 , 发出错误信号 , 表明执行任务出错 ;

协程任务 运行时 , 必须指定其 CoroutineScope 协程作用域 , 其会追踪所有的 协程任务 , CoroutineScope 协程作用域 可以取消 所有由其启动的协程任务 ;


常见的 CoroutineScope 协程作用域 :

  • GlobalScope : 该作用域是 进程级别的 , 与应用进程同级 , 即使 Activity 被销毁 , 协程任务也可以继续执行 ;
  • MainScope :作用域仅在 Activty 中 , 如果 Activity 被销毁 , 则 在 onDestory 生命周期函数中取消协程任务 ;
  • viewModelScope : 该作用与仅在 ViewModel 中使用 , 与 ViewModel 生命周期绑定 ;
  • lifecycleScope : 该作用与仅在 Activity 中使用 , 与 Activity 生命周期绑定 ;