• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Lua > Lua协同程序(COROUTINE)运行步骤分解

Lua协同程序(COROUTINE)运行步骤分解

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了lua coroutine,lua coroutine.yield,lua coroutine.start,lua coroutine.create,lua coroutine.wait等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

这是一段分析 lua 协程(协同程序,coroutine)的代码,来自 Lua reference manual interface (略有修改):

function foo (a)
    print("foo", a)
    return coroutine.yield(2*a)
end

co = coroutine.create(function (a,b)
   print("co-body1", a, b)
   local r = foo(a+1)
   print("co-body2", r)
   local r, s = coroutine.yield(a+b, a-b)
   print("co-body3", r, s)
   return b, "end"
end)

print("1----")
print("main", coroutine.resume(co, 1, 10))
print("2----")
print("main", coroutine.resume(co, "r"))
print("3----")
print("main", coroutine.resume(co, "x", "y"))
print("4----")
print("main", coroutine.resume(co, "x", "y"))
</div>

运行效果如下:
1------
co-body1    1   10
foo 2
main    true    4
2------
co-body2    r
main    true    11  -9
3------
co-body3    x   y
main    true    10  end
4------
main    false   cannot resume dead coroutine
</div>
这里一共调用了 4 次 resume ,让我们来看看它是怎么运行的。

第一次:
print("main", coroutine.resume(co, 1, 10))
</div>
1.执行 print("co-body1", a, b) ,a 和 b 的值为 resume 提供,a=1, b=10 ;
2.计算 a+1=2 ,进入 foo(a) ,同时将刚才的计算结果通过 a 参数传递,执行 print("foo", a);
3.考虑 return coroutine.yield(2*a) ;
4.计算 2*a=4 ,碰到 yield,挂起 foo(a) 调用,将 4 返回给 resume 。注意,foo 的 return 还没有执行;
5.resume 执行成功,返回 true, 4 。

第二次:
print("main", coroutine.resume(co, "r"))
</div>
1.从上一次挂起的 foo(a) 调用开始执行,接着执行没有完成的 return 调用;
2.因为 yield 返回 resume 的调用参数,此时 foo(a+1) 返回的值就是字符串 "r"。这里比较难理解。
因为大家可能会顺理成章地认为 local r 这个变量的值应该是 yield(2*a) 中的 2*a 的值。
需要注意的是, yield 的返回值 与 yield 参数的值 是不同的。
前者你可以将其保存在一个变量中,或者 return 它,或者不使用它(不保存 yield 的返回结果);后者则是 resume 的返回值。
3.执行 print("co-body2", r) ,r 的值为 "r" ;
4.考虑 local r, s = coroutine.yield(a+b, a-b) ;
5.计算 a+b=11, a-b=-9 ,碰到 yield ,挂起 co 的调用,将 11 和 9 返回给 resume 。注意,此时 local r, s 的赋值还没有开始。
这里不太好理解的是,为什么 a 的值不是 "r" ?因为 "r" 已经被上面的 yield 的返回值给消费掉了。
6.resume 执行成功,返回 true, 11, -9 。

第三次:
print("main", coroutine.resume(co, "x", "y"))
</div>
1.从上一次 yield 的地方开始执行,接着执行没有完成的 local r, s = 赋值。上面提到, yield 会返回 resume 的调用参数,因此 r 和 s 的值就是 "x" 和 "y" ;
2.执行 print("co-body3", r, s) 进行打印;
3.考虑 return b, "end" ;
4.b 的值一直都是 10 没有变,这里直接返回了,同时返回的还有 "end" 这个字符串;
5.由于协程函数返回的时候,它的所有返回值都作为 resume 的返回值返回。因此这里的 resume 执行成功,返回 10, "end" 。

第四次:
print("main", coroutine.resume(co, "x", "y"))
</div>
由于 co 函数已经返回,它处于 dead 状态,不能 resume ,因此第 4 次 resume 失败。

</div>

您可能想查找下面的文章:

  • Lua协程(coroutine)程序运行分析
  • Lua中的迭代器和泛型for介绍
  • Lua之协同程序coroutine代码实例
  • Lua协同程序(COROUTINE)运行步骤分解

相关文章

  • Linux下编写Lua扩展so文件和调用方法实例
  • Lua中函数的几个特别之处探究
  • Lua中强大的元方法__index详解
  • Ruby类实例变量、类实例方法和类变量、类方法的区别
  • Lua多重继承代码实例
  • Lua教程(十五):输入输出库(I/O库)
  • Lua中的函数浅析
  • 基于 aLi Lua Web Server 的一个简单例子
  • Lua中算术运算符的使用示例
  • 浅谈chuck-lua中的多线程

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Lua教程(十一):模块与包详解
    • Lua检测数组(tabble)中是否包含某个值
    • Lua中类的实现原理探讨(Lua中实现类的方法)
    • lua 基础教程
    • 用sysbench来测试MySQL的性能的教程
    • Lua中字符串(string)浅析
    • 详解Lua中的数组概念知识
    • 举例讲解Lua中的Table数据结构
    • Lua中table里内嵌table的例子
    • Lua函数与字符串处理简明总结

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有