Lua学习 -- 协同程序(coroutine)

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值