lua协程coroutine
协程是单线程运行的,它只是提供了一种代码在当前位置暂停,后续还能在当前位置恢复继续执行下去的机制。
1, 启动协程, 以及yield
local co1Func = function(str1, str2) for i=1,2 do print("-----", i, str1, str2) local str3, str4 = coroutine.yield(i) --返回值为resume的参数,即:a1, a2; b1, b2那些 print("-----", i, str3, str4) end print("----- exit", coroutine.running()) end local co1 = coroutine.create(co1Func) print("running:", coroutine.running()) local isSucc, result = coroutine.resume(co1, "a1", "a2") --返回值为yield的参数,即:i的值 print("resume1:", isSucc, result, coroutine.status(co1)) isSucc, result = coroutine.resume(co1, "b1", "b2") print("resume2:", isSucc, result, coroutine.status(co1)) isSucc, result = coroutine.resume(co1, "c1", "c2") print("resume3:", isSucc, result, coroutine.status(co1))
运行结果:
running:
----- 1 a1 a2
resume1: true 1 suspended
----- 1 b1 b2
----- 2 a1 a2
resume2: true 2 suspended
----- 2 c1 c2
----- exit thread: 0095D2B8
resume3: true nil dead
2, 嵌套协程
local coSubFunc = function(str1, str2) for i=1,2 do print("----------coSub", i, str1, str2) local str3, str4 = coroutine.yield(i) --返回值为resume的参数,即:a1, a2; b1, b2那些 print("----------coSub", i, str3, str4) end print("----------coSub exit", coroutine.running()) end local coMainFunc = function(str1, str2) local coSub = coroutine.create(coSubFunc) print("-----coMain", str1, str2, coroutine.running()) --调用了resume, 子协程才启动; 启动后, 主协程会挂起(suspended), 直到嵌套协程执行结束或yield local isSucc, result = coroutine.resume(coSub, "aa1", "aa2") --返回值为yield的参数 print("-----coMain resume1", isSucc, result, coroutine.running(), coroutine.status(coSub)) isSucc, result = coroutine.resume(coSub, "bb1", "bb2") print("-----coMain resume2", isSucc, result, coroutine.running(), coroutine.status(coSub)) print("-----coMain exit", coroutine.running()) end local coMain = coroutine.create(coMainFunc) print("running:", coroutine.running()) local isSucc, result = coroutine.resume(coMain, "a1", "a2") print("main a", isSucc, result, coroutine.running(), coroutine.status(coMain)) isSucc, result = coroutine.resume(coMain, "b1", "b2") print("main b", isSucc, result, coroutine.running(), coroutine.status(coMain))
运行结果:
running:
-----coMain a1 a2 thread: 009BD940
----------coSub 1 aa1 aa2
-----coMain resume1 true 1 thread: 009BD940 suspended
----------coSub 1 bb1 bb2
----------coSub 2 aa1 aa2
-----coMain resume2 true 2 thread: 009BD940 suspended
-----coMain exit thread: 009BD940
main a true nil nil dead
main b false cannot resume dead coroutine nil dead
coroutine.resume
local isSucc, result1, result2 = coroutine.resume(co)
1) 如果协程中途yield,则返回值为yield的参数;如果中途没有yield,则返回值为nil
2) 如果resume的协程已经dead,则会resume失败
coroutine.yield
local resumeParam1, resumeParam2 = coroutine.yield(arg1, arg2)
返回值为resume的参数
coroutine.status
获取协程状态:running, suspended(挂起), dead
coroutine.running()
获取当前在运行的协程
local co, isMain = coroutine.running()