首页 > 代码库 > lua学习笔记13:协程具体解释和举例

lua学习笔记13:协程具体解释和举例

一、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


lua学习笔记13:协程具体解释和举例