前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Kotlin 协程】协程底层实现 ② ( 协程调度器 | 协程任务泄漏 | 结构化并发 )

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

作者头像
韩曙亮
发布2023-03-30 18:05:24
6080
发布2023-03-30 18:05:24
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、协程调度器


协程 是在 调度器 中运行的 , 在协程中有 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 生命周期绑定 ;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、协程调度器
  • 二、协程任务泄漏
  • 三、结构化并发
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档