我们一起来学lua:协程(coroutine) 三

*上一期我们主要介绍了协程的相关函数,以及协程的创建。这一期,我们主要来介绍协程怎么进行协作的,而协作也正是协程的精华所在,小伙伴们,小板凳带好了嘛?≧◠◡◠≦✌*
生活当中我们做事情经常都是不可能一干到底的。比如,你正在看书,这时候突然来了个电话,或者说你在跟朋友家人视频聊天,这时候突然没信号了了。在这种情况下,我们都不得不停下原先手中的事情,去处理其他事情,等其他事情处理完了,再接着原先的事情往下走。为了处理这样的问题,协程也提供了协作机制。我们先来看看下面的一个简单实例。
协作实例一:
--创建一个协程,但还没有调用
read_co = coroutine.create(
 function ()
 print("看书")
 print("有电话打进来")
 coroutine.yield()
 print("电话打完了,继续看书")
 end
)
--开启读书协程
coroutine.resume(read_co)
print("打电话")
coroutine.resume(read_co)
运行结果:
看书
有电话打进来
打电话
电话打完了,继续看书

实例通过coroutine.yield()挂起协程,然后又通过coroutine.resume切换回协程,继续往下执行。是不是很简单?接下来我们来看下coroutine.yield跟coroutine.resume更深一步的做法,我们还是直接看实例吧。

协程实例二:
--创建一个协程,但还没有调用
read_co = coroutine.create(
 function ()
 print("看书")
 print("有电话打进来")
 local ret1, ret2 = coroutine.yield("我读到第三章了", "第二章很精彩")
 print("ret1 = "..ret1)
 print("ret2 = "..ret2)
 print("电话打完了,继续看书")
 end
)
--开启读书协程
local ret1, ret2, ret3 = coroutine.resume(read_co)
print(ret1)
print("ret2 = "..ret2)
print("ret3 = "..ret3)
print("打电话")
coroutine.resume(read_co,"王老师打来的电话","让我读第五章")

运行结果:

看书
有电话打进来
true
ret2 = 我读到第三章了
ret3 = 第二章很精彩
打电话
ret1 = 王老师打来的电话
ret2 = 让我读第五章
电话打完了,继续看书

从这个实例我们可以看到coroutine.yield的参数可以返回给前一个coroutine.resume。这里需要注意的是coroutine.resume的第一个返回值是协程运行是否出错,通过打印我们可以知道这里要么等于true要么等于false。从第二个返回值开始才是coroutine.yield传出来的值。协程使用coroutine.yield挂起之后,如何使它继续执行呢?还是要通过coroutine.resume,这时候coroutine.yield的返回值也就是coroutine.resume的入参信息。这里童鞋们看明白了嘛?
好了,今天协程内容就介绍到这里,明天我们继续深入探讨协程的协作问题,以及协作在异步通信的具体应用~~~

作者:Mark原文地址:https://segmentfault.com/a/1190000024544043

%s 个评论

要回复文章请先登录注册