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

举例详解Lua中的协同程序编程

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

goldensun 通过本文主要向大家介绍了lua源码详解与应用,lua 详解,lua程序设计,lua加到arm程序,lua程序设计第二版等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

 协同程序是协同的性质,可以把两个或更多的方法以可控制的方式执行。随着协同程序,在任何给定的时间,只有其协同程序运行之一,这在运行协同程序只能暂停其执行时,明确要求暂停。

上述定义可能看起来模糊。来告诉它更清楚,假设我们有两个方法,一个主程序方法和协同程序。当我们使用恢复功能调用协程,其开始执行,当我们调用yield功能,暂停执行。再次同协程可以继续从它被暂停的另一个恢复功能调用执行。这个过程可以继续,直到执行了协程的结束。
协同程序可用的功能

下表列出了在Lua协同程序及其相应的使用所有的可用功能。

2015529101326508.jpg (648×454)

 例子

让我们看一个例子就明白了协程的概念。

   local tempvar3 =10
   print("coroutine section 1", value1, value2, tempvar3)
   local tempvar1 = coroutine.yield(value1+1,value2+1)
   tempvar3 = tempvar3 + value1
   print("coroutine section 2",tempvar1 ,tempvar2, tempvar3)
   local tempvar1, tempvar2= coroutine.yield(value1+value2, value1-value2)
   tempvar3 = tempvar3 + value1
   print("coroutine section 3",tempvar1,tempvar2, tempvar3)
   return value2, "end"
end)

print("main", coroutine.resume(co, 3, 2))
print("main", coroutine.resume(co, 12,14))
print("main", coroutine.resume(co, 5, 6))
print("main", coroutine.resume(co, 10, 20))</div>

当我们运行上面的程序,会得到下面的输出。

main true 4 3
coroutine section 2 12 nil 13
main true 5 1
coroutine section 3 5 6 16
main true 2 end
main false cannot resume dead coroutine</div>

上面的例子是做什么?

如之前所提到的,我们使用恢复功能的动作开始,并产生函数来停止操作。此外,可以看到有由协程恢复功能接收多个返回值。这里将解释上面的程序每一个步骤,使之清楚。

  •     首先,我们创建了一个协同程序,并把它分配给变量名合作和协同程序需要在两个变量作为参数。
  •     当我们称之为第一恢复功能,值3和2分别被保持在临时变量value1和value2,直到协程的结束。
  •     为了理解这一点,我们已经使用了tempvar3初始化为10,它被由协程的后续调用更新为13和16,因为值1被保留为3,整个协同程序的执行。
  •     第一个coroutine.yield返回两个值4和3 是由更新输入参数3和2,yield语句得到了恢复函数。它还接收协程执行的真/假状态。
  •     关于协程的另一件事是如何恢复调用下一参数写成的照顾,在上述的例子; 可以看到,coroutine.yield分配变量接收到下一次调用参数,它提供做新业务与现有参数值之间的关系的一种强有力的方式。
  •     最后,一旦在协同程序的所有语句执行时,后续调用将返回false,并且“不能恢复死协同程序”语句作为回应。

另一个协程的例子

让我们来看一个简单的协同程序返回一个数字,从1到5 yield函数恢复功能。它创建协同程序,如果没有则恢复现有的协程。

   local function getNumberHelper()
      co = coroutine.create(function ()
      coroutine.yield(1)
      coroutine.yield(2)
      coroutine.yield(3)
      coroutine.yield(4)
      coroutine.yield(5)
      end)
      return co
   end
   if(numberHelper) then
      status, number = coroutine.resume(numberHelper);
      if coroutine.status(numberHelper) == "dead" then
         numberHelper = getNumberHelper()
         status, number = coroutine.resume(numberHelper);
      end
      return number
   else
      numberHelper = getNumberHelper()
      status, number = coroutine.resume(numberHelper);
      return number
   end
end
for index = 1, 10 do
   print(index, getNumber())
end</div>

当我们运行上面的程序,会得到下面的输出。

2 2
3 3
4 4
5 5
6 1
7 2
8 3
9 4
10 5</div>

往往有协同程序与多道程序语言的线程的比较,但要明白,协同程序线程有类似的功能,但只有一次执行,并不会执行兼任。

我们控制程序的执行顺序,以满足与提供暂时保留某些信息的需求。使用全局变量与协程,提供了协同程序更加灵活。
 

</div>

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

  • lua文件操作详解
  • 举例详解Lua中的协同程序编程
  • 详解Lua中的元表概念
  • 详解Lua中的数组概念知识
  • 详解Lua中if ... else语句的使用方法
  • 详解Lua中的if语句的使用方法
  • 详解Lua中的while循环语句的使用
  • 详解Lua中的数据类型
  • 详解Lua中的变量相关知识点
  • lua中赋值类型代码详解

相关文章

  • Lua中的迭代器和泛型for学习总结
  • 使用Lua来扩展C++程序的方法
  • C语言模块回调Lua函数的两种方法
  • Lua判断数据类型的方法
  • Lua极简入门指南(六):模块
  • Lua中的string库和强大的模式匹配学习笔记
  • Lua中关于求模与求余的区别介绍
  • Lua极简入门指南(一):函数篇
  • Lua中的模块与module函数详解
  • lua+love2d制作的2048游戏

文章分类

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

最近更新的内容

    • 用sysbench来测试MySQL的性能的教程
    • Redis教程(三):List数据类型
    • Lua中的操作符和表达式总结
    • Lua中计算、执行字符串中Lua代码的方法
    • Lua教程(二):基础知识、类型与值介绍
    • Lua学习笔记之数据结构
    • Lua性能优化技巧(三):关于表
    • 详解Lua中的数据类型
    • Lua编程示例(四):Lua标准库之表库、字符串库、系统库
    • Lua判断变量是否为数字、字符串是否可以转换为数字等

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

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