博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lua5 Coroutine 1 (协同例程)
阅读量:6826 次
发布时间:2019-06-26

本文共 1835 字,大约阅读时间需要 6 分钟。

hot3.png

Lua 支持 coroutine ,这个东西也被称为协同式多线程 (collaborative multithreading) 。 Lua 为每个 coroutine 提供一个独立的运行线路。 然而和多线程系统中的线程不同,coroutine 只在显式的调用了 yield 函数时才会挂起。

创建一个 coroutine 需要调用一次  。 它只接收单个参数,这个参数是 coroutine 的主函数。 create 函数仅仅创建一个新的 coroutine 然后返回它的控制器 (一个类型为 thread 的对象); 它并不会启动 coroutine 的运行。

当你第一次调用  时, 所需传入的第一个参数就是  的返回值。 这时,coroutine 从主函数的第一行开始运行。 接下来传入  的参数将被传进 coroutine 的主函数。 在 coroutine 开始运行后,它讲运行到自身终止或是遇到一个 yields 。

coroutine 可以通过两种方式来终止运行: 一种是正常退出,指它的主函数返回(最后一条指令被运行后,无论有没有显式的返回指令); 另一种是非正常退出,它发生在未保护的错误发生的时候。 第一种情况中, 返回 true , 接下来会跟着 coroutine 主函数的一系列返回值。 第二种发生错误的情况下,  返回 false , 紧接着是一条错误信息。

coroutine 中切换出去,可以调用 。 当 coroutine 切出,与之配合的  就立即返回, 甚至在 yield 发生在内层的函数调用中也可以(就是说, 这不限于发生在主函数中,也可以是主函数直接或间接调用的某个函数里)。 在 yield 的情况下, 也是返回 true, 紧跟着那些被传入  的参数。 等到下次你在继续同样的 coroutine ,将从调用 yield 的断点处运行下去。 断点处 yield 的返回值将是  传入的参数。

类似  ,  这个函数也将创建一个 coroutine , 但是它并不返回 coroutine 本身,而是返回一个函数取而代之。一旦你调用这个返回函数,就会切入 coroutine 运行。 所有传入这个函数的参数等同于传入  的参数。  会返回所有应该由除第一个(错误代码的那个布尔量) 之外的由  返回的值。 和  不同,  不捕获任何错误; 所有的错误都应该由调用者自己传递。

看下面这段代码展示的一个例子:

     function foo (a)       print("foo", a)       return coroutine.yield(2*a)     end          co = coroutine.create(function (a,b)           print("co-body", a, b)           local r = foo(a+1)           print("co-body", r)           local r, s = coroutine.yield(a+b, a-b)           print("co-body", r, s)           return b, "end"     end)                 print("main", coroutine.resume(co, 1, 10))     print("main", coroutine.resume(co, "r"))     print("main", coroutine.resume(co, "x", "y"))     print("main", coroutine.resume(co, "x", "y"))

当你运行它,将得到如下输出结果:

     co-body 1       10     foo     2          main    true    4     co-body r     main    true    11      -9     co-body x       y     main    true    10      end     main    false   cannot resume dead coroutine

转载于:https://my.oschina.net/u/2005342/blog/308877

你可能感兴趣的文章
SqlServer 巧妙解决 多条件组合查询
查看>>
php - 中文字符串分割
查看>>
图解HTTP
查看>>
HTML - form (转)
查看>>
浅析C#深拷贝与浅拷贝 (转)
查看>>
3226. [SDOI2008]校门外的区间【线段树】
查看>>
113. Path Sum II
查看>>
如何解决jersey框架中以json格式返回数组,当数组中元素一个时json格式不对
查看>>
HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
查看>>
浅谈静态变量和类
查看>>
Opencv笔记(十九)——直方图(一)
查看>>
AngularJs注解之----@input和@output
查看>>
抽象工厂模式(Abstract Factory)
查看>>
2.宽带安装与故障修复-1-新装
查看>>
aiXcoder插件
查看>>
面向对象的特征
查看>>
Linux基础知识--用户账户管理
查看>>
Kafka参数调优实战,看这篇文章就够了!
查看>>
delphi 把一个表的内容转到另一个表暂存时出错的解决方法。
查看>>
JavaScript 操作cookie
查看>>