首页 > 代码库 > lua学习笔记12:协程详解和举例
lua学习笔记12:协程详解和举例
一、coroutine.create创建协程
参数是协程的主函数,返回一个thread对象
二、协程状态
协程有4种状态:挂起(suspended)、运行(running)、死亡(dead)和正常(normal)
coroutine.status(co)返回协程当前的状态
协程创建完之后处于挂起状态
三、执行协程
协程执行后,状态变为running,当协程主全部执行完之后,变为dead状态
主函数执行完时,它的返回的值和true一起作为对应resume的返回值
四、中断协程
主函数执行过程中遇到coroutine.yield()中断,再次调用resume将从中断的位置开始执行
suspended
before 1
suspended
after 1
before 2
suspended
after 2
suspended
true 2
suspended
true 3
dead
五、coroutine.wrap创建协程
参数是协程的主函数,返回一个函数,每当调用这个返回函数,都会执行协程主函数。
返回值时yield或主函数的返回值,没有执行结果布尔值和错误码,因此无法检测出运行时的错误,也无法检查 wrap 所创建的协程的状态。
before
2
after
3
# 真心搞不懂wrap协程中断后如何继续执行,请路过的大神指点迷津
六、获得运行中的协程
函数 coroutine.running 用于返回正在运行中的协程,如果没有协程运行,则返回 nil
running: nil
running: thread: 006DC380
is co: true
status: running
running: nil
# 不明白,如果此时有多个协程正在运行,running()的返回值时是什么,难道是个table?
参数是协程的主函数,返回一个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
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:协程详解和举例
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。