请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

真的好难,大概写了下这个例子的运行过程,以供参考,但是还需要慢慢消化

Lua例子运行过程

第一次循环

  • producer创建,状态为Created,创建初始协程用于启动
  • consumer创建,状态为Created,创建初始协程用于启动
  • producer.resume(Unit):进入resume挂起点,状态从Created到Resumed
  • 运行producer的协程体
  • producer内部yield(i):进入yield挂起点,状态从Resumed到Yielded
  • 拿到producer resume处的挂起点(continuation)并恢复,且将值result(0)发布出去
  • consumer.resume(result):进入resume挂起点,状态从Created到Resumed
  • 运行consumer协程体
  • consumer内部yield(Unit):进入yield挂起点,状态从Resumed到Yielded
  • consumer resume挂起点并恢复
  • 打印
    • send 0
    • start param

第二次循环

  • producer.resume(Unit): 进入resume挂起点,状态从Yielded到Resumed,恢复yield挂起点
  • producer内部yield(i):进入yield挂起点,状态从Resumed到Yielded
  • 拿到producer.resume处的挂起点(continuation)并恢复,将值result(1)发布出去
  • consumer.resume(result):进入resume挂起点,状态从Yielded到Resumed,并通过yield处的挂起点将值result(1)发布出去
  • 进入yield挂起点,状态从Resumed到Yielded,
  • consumer resume挂起并恢复
  • 打印
    • send 1
    • receiver 1

第三次循环 2

  • 打印
    • send 2
    • receiver 2

第四次循环 3

  • 打印
    • send 3
    • receiver 3

第五次循环

  • producer.resume(Unit):进入resume挂起点,状态从Yielded到Resumed,恢复yield挂起点
  • 继续执行,协程体结束,末尾返回200
  • 执行producer的resumeWith,拿到resume处的挂起点(continuation),并将result 200发布出去,状态转为Dead
  • consumer.resume(200):resume挂起点挂起,状态从Yield转为Resumed
  • consumer yield处挂起点恢复,并将值(200)发布出去
  • 继续执行,协程体结束
  • 执行consumer的resumeWith,状态转为Dead
  • consumer resume挂起点恢复
  • 打印
    • receiver 200

正在回答 回答被采纳积分+3

1回答

bennyhuo 2023-05-04 09:51:42

不错,到这个程度基本上理解了执行流程了。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信