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

mac2025-03-01  2

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
最新回复(0)