首页 > 代码库 > lua学习笔记12:协程详解和举例

lua学习笔记12:协程详解和举例

一、coroutine.create创建协程
参数是协程的主函数,返回一个thread对象
co = coroutine.create(function()
	print("coroutine execute!")
end)

二、协程状态
协程有4种状态:挂起(suspended)、运行(running)、死亡(dead)和正常(normal)
coroutine.status(co)返回协程当前的状态
协程创建完之后处于挂起状态
print(coroutine.status(co))

输出:

suspended


三、执行协程
协程执行后,状态变为running,当协程主全部执行完之后,变为dead状态

coroutine.resume(co)
print(coroutine.status(co))

输出:

running


主函数执行完时,它的返回的值和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 所创建的协程的状态。
resumer = coroutine.wrap(function(a)
	a = a + 1
	print("before")
	coroutine.yield(a)
	print("after")
	a = a + 1
	return a
end)
print(resumer(1))
print(resumer(2))
输出:
before
2
after
3


# 真心搞不懂wrap协程中断后如何继续执行,请路过的大神指点迷津

六、获得运行中的协程
函数 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


# 不明白,如果此时有多个协程正在运行,running()的返回值时是什么,难道是个table?

lua学习笔记12:协程详解和举例