【Kotlin 协程】协程底层实现 ② ( 协程调度器 | 协程任务泄漏 | 结构化并发 )
admin
2024-02-16 07:49:01

文章目录

  • 一、协程调度器
  • 二、协程任务泄漏
  • 三、结构化并发





一、协程调度器



协程 是在 调度器 中运行的 , 在协程中有 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 生命周期绑定 ;

相关内容

热门资讯

米拉日巴佛阁位于甘南合作市郊 米拉日巴佛阁位于甘南合作市郊,距离市中心约3公里,是一座红色的藏式高层建筑。佛阁的高层宗教建筑在藏区...
原创 5... 要知道,5月27日赵子豪在上海迪士尼的照片和短文在社交平台上被不少人热聊,他背着树懒卡通包,还配了句...
沉浸式露营体验!长春这家河畔休... 露营,作为一种亲近自然、放松身心的休闲方式,越来越受到人们的喜爱。然而,传统的露营需要准备大量的装备...
杭州龙井的茶,飘了旧香 杭州龙井寻香记 一、风里飘来的旧香 暮春的杭州总裹着一层湿润的绿,我原本只是趁着清明后的假期来散心,...