真的好难,大概写了下这个例子的运行过程,以供参考,但是还需要慢慢消化
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挂起点并恢复
- 打印
第二次循环
- 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挂起并恢复
- 打印
第三次循环 2
第四次循环 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挂起点恢复
- 打印