Lua中的协程
2015-11-11 17:29
489 查看
函数 coroutine.create用于创建一个新的协程,它只有一个以函数形式传入的参数,该函数是协程的主函数,它的代码是协程所需执行的内容
co = coroutine.create(function()io.write("coroutine create!\n")end)print(co)当创建完一个协程后,会返回一个类型为 thread 的对象,但并不会马上启动运行协程主函数,协程的初始状态是处于挂起状态
coroutine.status - 查看协程状态
协程有 4 种状态,分别是:挂起(suspended)、运行(running)、死亡(dead)和正常(normal),可以通过 coroutine.status 来输出查看协程当前的状态。print(coroutine.status(co))[/code]
coroutine.resume - 执行协程
函数 coroutine.resume 用于启动或再次启动一个协程的执行coroutine.resume(co)[/code]协程被调用执行后,其状态会由挂起(suspended)改为运行(running)。不过当协程主函数全部运行完之后,它就变为死亡(dead)状态。传递给 resume 的额外参数都被看作是协程主函数的参数
co = coroutine.create(function(a, b, c)print("co", a, b, c)end)coroutine.resume(co, 1, 2, 3)[/code]协程主函数执行完时,它的主函数所返回的值都将作为对应 resume 的返回值
co = coroutine.create(function()return 3, 4end)print(coroutine.resume(co))[/code]
coroutine.yield - 中断协程运行
coroutine.yield 函数可以让一个运行中的协程中断挂起co = coroutine.create(function()for i = 1, 3 doprint("before coroutine yield", i)coroutine.yield()print("after coroutine yield", i)endend)coroutine.resume(co)[/code]coroutine.resume(co) 上面第一个 resume 唤醒执行协程主函数代码,直到第一个 yield。第二个 resume 激活被挂起的协程,并从上一次协程被中断 yield 的位置继续执行协程主函数代码,直到再次遇到 yield 或程序结束。resume 执行完协程主函数或者中途被挂起(yield)时,会有返回值返回,第一个值是 true,表示执行没有错误。如果是被 yield 挂起暂停,yield 函数有参数传入的话,这些参数会接着第一个值后面一并返回
co = coroutine.create(function(a, b, c)coroutine.yield(a, b, c)end)print(coroutine.resume(co, 1, 2, 3))[/code]
以 coroutine.wrap 的方式创建协程
跟 coroutine.create 一样,函数 coroutine.wrap 也是创建一个协程,但是它并不返回一个类型为 thread 的对象,而是返回一个函数。每当调用这个返回函数,都会执行协程主函数运行。所有传入这个函数的参数等同于传入 coroutine.resume 的参数。 coroutine.wrap 会返回所有应该由除第一个(错误代码的那个布尔量) 之外的由 coroutine.resume 返回的值。 和 coroutine.resume 不同之处在于, coroutine.wrap不会返回错误代码,无法检测出运行时的错误,也无法检查 wrap 所创建的协程的状态function wrap(param)print("Before yield", param)obtain = coroutine.yield()print("After yield", obtain)return 3endresumer = coroutine.wrap(wrap)print(resumer(1))print(resumer(2))[/code]
coroutine.running - 返回正在运行中的协程
函数 coroutine.running 用于返回正在运行中的协程,如果没有协程运行,则返回 nilprint(coroutine.running())co = coroutine.create(function()print(coroutine.running())print(coroutine.running() == co)end)coroutine.resume(co)print(coroutine.running())[/code]
相关文章推荐
- An Evaluation of Bong Joon-ho’s Snowpier
- Lua中强大的元方法__index详解
- lua math库
- lua string 库
- Lua中handler方法的原理详解
- lua 面向对象
- [Leetcode]Evaluate Reverse Polish Notation
- lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值
- lua metatable及其相关方法的简述
- sicily 10359 Valuable Jewellery
- lua元方法__index,对table进行初始化,设置默认值
- lua开发--字符串,json,编码转换
- Lua UnPack函数用法
- Faster-rnnlm代码分析3 - EvaluateLM(前向计算ForwardPropagate)
- lua语言
- SLua 绑定 Protobuf-Lua (protoc-gen-lua) 在SLua中使用 Protobuf
- 【绑定自定义类至Lua】(四)使用绑定C++至Lua的自定义类
- 【绑定自定义类至Lua】(三)动手绑定自定义类至Lua
- 【绑定自定义类至Lua】(二)新建项目中配制环境
- 【绑定自定义类至Lua】(一)环境搭建