一、coroutine.create创建协程
參数是协程的主函数,返回一个thread对象
co = coroutine.create(function() print("coroutine execute!") end)
二、协程状态
协程有三种状态:挂起(suspended)、执行(running)和死亡(dead)
coroutine.status(co)返回协程当前的状态
协程创建完之后处于挂起状态
print(coroutine.status(co))
输出:
suspended
三、运行协程
协程运行后。状态变为running,当协程主所有运行完之后,变为dead状态
coroutine.resume(co) print(coroutine.status(co))
输出:
dead
主函数运行完时。它的返回的值和true一起作为相应resume的返回值
co = coroutine.create(function(a, b) print("coroutine execute!") return a + b end) print(coroutine.resume(co, 2, 3))
输出:
ture 5
四、中断协程
主函数运行过程中遇到coroutine.yield()中断,再次调用resume将从中断的位置開始运行
co = coroutine.create(function() for i = 1, 2 do print("before", i) coroutine.yield() print("after", i) end end) print(coroutine.status(co)) coroutine.resume(co) print(coroutine.status(co)) coroutine.resume(co) print(coroutine.status(co)) coroutine.resume(co) print(coroutine.status(co))
输出:
suspended
before 1
suspended
after 1
before 2
suspended
after 2
dead
假设是被挂起yield函数有传參,这些參数和true一起作为相应resume的返回值
co = coroutine.create(function(a) a = a + 1 coroutine.yield(a) a = a + 1 return a end) print(coroutine.status(co)) print(coroutine.resume(co,1)) print(coroutine.status(co)) print(coroutine.resume(co,1)) print(coroutine.status(co))
输出:
suspended
true 2
suspended
true 3
dead
五、coroutine.wrap创建协程
參数是协程的主函数。返回一个函数,每当调用这个返回函数,都会运行协程主函数。
返回值时yield或主函数的返回值,没有执行结果布尔值和错误码,因此无法检測出执行时的错误。也无法检查 wrap 所创建的协程的状态。
function co_func(a) local c = coroutine.yield(a + 1) return c * 2 end co = coroutine.wrap(co_func) ret1 = co(1) print(ret1) ret2 = co(10) print(ret2)
输出:
2
20
运行一次协程对象。协程就会被激活一次,再次调用时从上一次断点的地方继续运行。
挂起时yield的參数将作为返回值,再次激活时的參数将作为yield的返回值。
六、获得执行中的协程
函数 coroutine.running 用于返回正在执行中的协程,假设没有协程执行。则返回 nil
print("running:",coroutine.running()) co = coroutine.create(function() print("running:",coroutine.running()) print("is co:", coroutine.running() == co) print("status:", coroutine.status(coroutine.running())) end) coroutine.resume(co) print("running:",coroutine.running())
输出:
running: nil
running: thread: 006DC380
is co: true
status: running
running: nil