coroutine.create(func):创建一个协程,并传入一个函数(function),返回的是创建的协程,创建后的协程会进入挂起状态。
coroutine.resume(co[,…]):启动协程,传入要启动的协程和协程函数需要的参数(当不是第一次启动时,参数是作为上次挂起的返回值),返回的是是否正常启动协程(boolean)和被挂起时yield传来的参数或是函数的返回值。
coroutine.yield(…):挂起正在运行的协程,传入的参数会作为上一次resume启动的返回值,而yield挂起的返回值是下一次resume启动传入的参数。
function func(a,b)
print("fun=====",a,b)//1,2
print("yield return =====",coroutine.yield(a))//3,4
return a + b
end
local coe = coroutine.create(func)
print("resume1 =====",coroutine.resume(coe,1,2))//true 1
print("resume2 =====",coroutine.resume(coe,3,4))//true 3
print("resume3 =====",coroutine.resume(coe,5,6))//false cannot resume dead coroutine
解析:
1. 首先创建了协程coe,并将func传入,
2. 第一次启动协程,传入了参数1,2给协程函数,运行协程函数func,
3. 进入函数func,首先打印了传入的两个参数a,b,
4. 对协程进行了挂起操作,挂起传入的参数a,作为第一个resume的返回值,此时协程进入挂起状态,
5. 打印resume的返回值,第一个返回的是该协程是否被正常启动,正常启动为true,第二个返回的是步骤4挂起传来的参数a,将返回值输出,
6. 第二次启动协程,传入了参数3,4作为步骤5挂起的返回值,继续运行协程函数,
7. 打印yield挂起函数的返回值,为步骤6启动时传入的函数3,4,打印yield的返回值,
8. 函数返回了a + b ,作为第二次启动的返回输出,同步骤5,
9. 第三次启动协程,传入了参数5,6,但协程已执行完毕,进入dead状态,不可被唤醒启动,因此第三次resume的返回值是false和“cannot resume dead coroutine”。
运行结果:
fun===== 1 2
resume1 ===== true 1
yield return ===== 3 4
resume2 ===== true 3
resume3 ===== false cannot resume dead coroutine
coroutine.status(co):查看协程当前状态,suspended–挂起,running–运行中,dead–结束
coroutine.warp(func):创建一个协程,并传入一个函数(function),返回的是传入的函数,创建后的协程会进入挂起状态。唤醒该协程只需调用返回的协程函数即可。(该线程无法使用coroutine.status())
coroutine.runnning():返回正在运行协程的线程号
function func(a)
print("a==",a) //a== 1
print("coFunc running1",coroutine.running())//thread: XXXXXXXX
if co then
print("co status2",coroutine.status(co))// running
end
local r = coroutine.yield()
print("r==",r)//2 //4
end
local coFunc = coroutine.wrap(func)
coFunc(1)
print("coFunc running2",coroutine.running()) //nil
coFunc(2)
print("---------------------------------")
co = coroutine.create(func)
print("co status1",coroutine.status(co))//suspended
coroutine.resume(co,3)
print("co status3",coroutine.status(co))//suspended
coroutine.resume(co,4)
print("co status4",coroutine.status(co))//dead
解析:
1.首先使用coroutine.warp(func)创建了一个协程,并通过调用返回的coFunc来启动协程,
2.运行协程函数,首先打印了传入的函数1,之后又打印了此时的运行协程的线程号,
3.接下来的判断语句块是为了获取co协程此时的运行状态,因此此时无法进入
4.协程被挂起
5.打印此时正在运行的协程的线程号,被挂起的协程不能被获取
6.恢复运行coFunc,传参2
7.r被赋值为2,并打印出来,结束协程。
------------------------------------------------
8.co协程与上类似,使用coroutine.create(func)创建协程,......
9.执行到判断语句时,因此时已定义co,进入判断语句块,输出当前的运行状态,......
运行结果:
a== 1
coFunc running1 thread: 02A77A40
coFunc running2 nil
r== 2
---------------------------------
co status1 suspended
a== 3
coFunc running1 thread: 02A7D4F0
co status2 running
co status3 suspended
r== 4
co status4 dead