当前位置: 首页 > news >正文

电脑编程网站企业档案网站建设

电脑编程网站,企业档案网站建设,制作企业网站首页效果图,国内信息图制作网站协程 根据 是否保存切换 调用栈 #xff0c;分为#xff1a; 有栈协程#xff08;stackful coroutine#xff09;无栈协程#xff08;stackless coroutine#xff09; 在代码上的区别是#xff1a;是否可在普通函数里调用#xff0c;并暂停其执行。 Kotlin协程…协程 根据 是否保存切换 调用栈 分为 有栈协程stackful coroutine无栈协程stackless coroutine 在代码上的区别是是否可在普通函数里调用并暂停其执行。 Kotlin协程必须在挂起函数中调用和恢复属于 无栈协程。 常见的语言协程实现 有栈协程Go、Lua无栈协程Kotlin、C 20、Clojure、JavaScript 二、无栈协程 和 Continuation 2.1 CPSContinuation-passing-style 在上篇源码分析中不难发现 执行的结果都是通过 Continuation 来返回。 2.1.1 Continuation Continuation 就是 一个通用的回调接口返回 ResultT 值 或 异常。 Continuation is a generic callback interface. —— Roman Elizarov public interface Continuationin T {public val context: CoroutineContextpublic fun resumeWith(result: ResultT) }2.1.2 CPS 挂起函数 调用 其他挂起函数时会将自己的 Continuation对象 作为 completion 参数 传递 这种传递Continuation的方式称为 连续传递风格Continuation-passing-style简称为 CPS。 挂起函数 编译后会创建基于 ContinuationImpl 对象把 调用者Continuation 传给 completion 构造参数 internal abstract class BaseContinuationImpl(public val completion: ContinuationAny?? )2.1.3 Continuation结果返回 上篇知道 协程执行在 BaseContinuationImpl.resumeWith 方法 同样 结果返回逻辑 也在这里看下代码 和 传递逻辑顺序 相反结果按 逐步向上 返回。 分析当获取结果后通过 while 循环completion 将结果向上传递一般是协程 StandaloneCoroutine 作为最终的 completion 完成结果回调。 2.2 状态机 无栈协程是通过 状态机 和 状态 保存恢复 来实现协程挂起恢复。 和 每个 回调 都要创建 回调对象 相比状态机 通过 状态 记录 执行位置 当 挂起函数完成后只需 恢复状态 接着执行后面的代码。 其实就是通过 switch(label) 做判断判断位置执行。 状态机 vs 回调有以下几个优点 复用 方法对象和状态避免每次分配对象简化 循环 和 使用 高阶函数 以下面 请求解析数据 为例launch {} 对应的 lambda挂起函数 分析 Kotlin 状态机 和 状态: GlobalScope.launch {// 挂起点1val data getData()// 挂起点2val result parseData(data)println(data: $data, result: $result) }Kotlin编译后逻辑以 伪代码 表示 class $main$1 extends SuspendLambda {// 挂起点的位置int label;// 状态 对象 保存 和 恢复Object L$0;// 更多状态 L$1 L$2 ...Object invokeSuspend(Object result) {Object obj;switch (this.label) {case 0:this.label 1;obj getData(this);// 表示挂起存储 状态 label 1// 恢复时再次调用 invokeSuspend恢复执行下面if (obj COROUTINE_SUSPENDED) {return COROUTINE_SUSPENDED;}// 没有break如果没有挂起直接 执行下面的过程case 1:// 挂起恢复后String data (String) result;// 如果没有挂起直接执行则是// String data (String) obj;this.label 2;// 保存 状态this.L$0 data;obj parseData(data, this);if (obj COROUTINE_SUSPENDED) {return COROUTINE_SUSPENDED;}case 2:// 挂起恢复后Integer num (Integer) result;// 如果没有挂起直接执行则是// Integer num (Integer) obj;// 恢复状态String data (String) this.L$0;System.out.println(data: data ,num: num);return Unit.INSTANCE;default:throw new IllegalStateException(call to resume before invoke with coroutine);}} }2.3 CPS Transform 上面说到调用挂起函数 continuation 会作为函数参数传递但是 声明挂起函数时 并没有 continuation参数。而是 Kotlin 会在参数列表 自动加上 Continuation 参数这个操作叫做 CPS Transform。 举例下面挂起函数 suspend fun T CompletableFutureT.await(): T而在 CPS Transform 后实际的代码是 fun T CompletableFutureT.await(continuation: ContinuationT): Any?小结 Kotlin协程通过 状态机 实现复用闭包。挂起函数 编译成 Continuation 回调对象CPS。suspend 以同步的编程方式执行异步方法 文档 Coroutine | Wikipedia KEEP | KotlinKotlinConf 2017 - Deep Dive into Coroutines on JVMContinuationImpl.kt为什么无栈协程不能被非协程函数嵌套调用 | 知乎浅谈有栈协程与无栈协程 | 知乎理解有栈无栈协程
http://www.hkea.cn/news/14331983/

相关文章:

  • 查询网站名有没有收录怎么制作微信网站
  • 关于做网站公司周年大促销湖州注册公司
  • 项目网站设计网站建设设计技巧
  • 十佳深圳网站设计广东今天新闻最新消息
  • 在哪个网站上做兼职比较好wordpress购物插件
  • 云商网站建设wordpress侧面小工具
  • .net asp可以外链其它网站吗网络营销方式对营销人员的启示
  • 网站页面分析范文网页制作合同样本
  • 寿光建设银行光明路网站农业农村部农田建设管理司网站
  • 伊春北京网站建设外国电商设计网站有哪些
  • 百度怎样收录到网站本地做的网站怎么解析到域名
  • 南宁制作网站的公司用wordpress设计html5
  • 在线网站优化公司php网站案例
  • 张掖网站设计公司广告设计专业大学排名
  • 做网站时尺寸多大网站按天扣费优化推广
  • 网站建设需要考啥证宿迁房产网新楼盘
  • 织梦的手机端网站模板主任说到学校新网站的建设工作
  • 安康电商网站建设如何制作网站机器人
  • 百度搜索网站怎么做北京免费建站网络营销
  • 建设银行官网官方网站做淘宝客的网站需要备案吗
  • 做二手钢结构网站广西住房和城乡建设厅官方网站
  • 学设计的网站有哪些内容网站建设商谈
  • 建立一个个人网站网站死链接怎么删除
  • 网站违法和做网站得有关系企业 网站规划与网页设计word
  • 网站打开速度优化wordpress 设置子菜单
  • 江西手机网站建设做网站都有哪些费用
  • 杭州设计公司老总被烧seo零基础入门教程
  • 分类网站上怎么做锚文本网站怎么做成二维码
  • 网站发展做网站的尺寸
  • 设计师常备设计网站大全有凡客模版怎么建设网站