美文网首页
协程1-suspend关键字

协程1-suspend关键字

作者: Xigong | 来源:发表于2020-08-24 19:53 被阅读0次

suspend 有两个:

  • suspend 关键字,用来修饰函数定义


    image.png
  • suspend 函数,用来把一个函数转化为suspend挂起函数


    image.png

suspend 函数的执行原理:

  • suspend 函数会编译成普通的函数,在函数最后增加一个Continuation 的形参。

例如:


image.png

编译后生成了:


image.png
  • 在这里调用一个挂起函数会怎么执行呢?


    image.png

编译生成了:


image.png

翻译成伪代码帮助理解(忽略一些无关因素):

image.png

总结,调用挂起函数的地方,编译器添加了判断条件,进行返回,然后再恢复时,重新调用该方法,又回到了上次函数返回的地方。

再总结一遍,挂起函数,编辑器在内部生成了一个Continuation,然后执行到挂起点,return。接着协程恢复时,通过上一次记录的位置,又调用这个函数,跳转到上一次的结束位置,继续执行,往复循环,直到函数执行结束且没有再继续执行Continuation

QA:

  1. 再次调用这个函数又能回到上次执行完的地方是怎么实现的呢?
    举一个复杂的例子


    image.png

是通过switch和label,实现的,Continuaion 会记录上一次离开函数的位置


image.png

下一执行的时候,会判断label这个值


image.png

break ,然后会走到这里:


image.png

延迟5秒后,继续执行contrinuation,又会执行test1函数,直到全部执行完毕。

相关文章

  • 协程1-suspend关键字

    suspend 有两个: suspend 关键字,用来修饰函数定义image.png suspend 函数,用来把...

  • golang学习笔记(十)并发

    1、goroutine (1)通过go关键字创建一个协程(2)主协程退出后,子协程也会退出 2、runtime包 ...

  • Tornado入门(三)【协程】

    协程 在Tornado中,协程是推荐使用的异步方式。协程使用yield关键字暂停或者恢复执行,而不是回调链的方式。...

  • 聊聊Kotlin 协程的「非阻塞式」

    在kotlin协程中,有个非常重要的关键字 —— suspend,这个关键字就是协程最核心的那个「非阻塞式」的「挂...

  • 网络爬虫(十二)

    爬虫用到协程的内容 coroutine:协程对象,用async关键字定义一个方法,就返回一个协程对象。下面的c就是...

  • Kotlin - 协程中的那些关键点

    ### 写在前面 1.协程“非阻塞式挂起” 你真的弄懂了吗? 2.协程suspend关键字到底有多神奇? 3.协程...

  • Python控制流程-协程(1)

    句法上看, 协程与生成器类似, 都是定义体中包含yield关键字的函数。 具体的协程的使用: 1.在协程中yiel...

  • Python协程深入理解

    从语法上来看,协程和生成器类似,都是定义体中包含yield关键字的函数。yield在协程中的用法:在协程中yiel...

  • Python协程深入理解

    从语法上来看,协程和生成器类似,都是定义体中包含yield关键字的函数。yield在协程中的用法: 在协程中yie...

  • 协程

    作为协程的生成器 协程使用生成器函数定义 如果协程只需从客户接收数据,那么yield右边没有关键字,产出为隐式指定...

网友评论

      本文标题:协程1-suspend关键字

      本文链接:https://www.haomeiwen.com/subject/vrxojktx.html