在菜鸟教程学习lua时,在coroutine这一章看到这么一段

coroutine.running就可以看出来,coroutine在底层实现就是一个线程。

当create一个coroutine的时候就是在新线程中注册了一个事件。

当使用resume触发事件的时候,create的coroutine函数就被执行了,当遇到yield的时候就代表挂起当前线程,等候再次resume触发事件。

对此感到十分困惑,因为在unity中的协程是在主线程中执行的,在我看来既然叫协程不叫线程那就明显是跟线程的原理是不一样的,更重要的是在这一段代码中

function foo (a)print("foo 函数输出", a)return coroutine.yield(2 * a) -- 返回  2*a 的值
endco = coroutine.create(function (a , b)print("第一次协同程序执行输出", a, b) -- co-body 1 10local r = foo(a + 1)print("第二次协同程序执行输出", r)local r, s = coroutine.yield(a + b, a - b)  -- a,b的值为第一次调用协同程序时传入print("第三次协同程序执行输出", r, s)return b, "结束协同程序"                   -- b的值为第二次调用协同程序时传入
end)print("main", coroutine.resume(co, 1, 10)) -- true, 4
print("--分割线----")
print("main", coroutine.resume(co, "r")) -- true 11 -9
print("---分割线---")
print("main", coroutine.resume(co, "x", "y")) -- true 10 end
print("---分割线---")
print("main", coroutine.resume(co, "x", "y")) -- cannot resume dead coroutine
print("---分割线---")

coroutine.resume()的执行必然会阻塞主线程,这从逻辑上说不通,我也进行测试过

在网上看了其他人的分析更确定了我的结论。

所以我认为,lua的coroutine跟unity一样都是在主线程执行的,只是它特别维护了一块独立的内存,用以实现对同一段代码进行断续的执行。

另外,coroutine.running()这个方法在主线程调用的时候是无法获得当前协程的id的,以为此时协程并没有执行(因为协程是在主线程执行的,此时已被挂起或销毁)。只有在协程的代码块中才能正确获取当前的协程id,在主线程中调用时候应该获得的是主线程id(有待商榷,测试时候主线程获得的id是固定的,而在协程中获得的id是随协程切换而变化的)

//

关于coroutine.resume的参数问题。

当coroutine  被create后,第一次调用resume传递的方法的初始化参数这里没问题。

但是第二次以及以后穿的参数又是何物,这里必须提到coroutine的中断位置问题,参考上方代码

有这么一句

 local r, s = coroutine.yield(a + b, a - b)  -- a,b的值为第一次调用协同程序时传入

当调用yield时候协程会挂起交由主程序执行等待下次resume

注意,挂起时这一句并没有执行完毕只是执行了yield并挂起协程交由主程序执行(这也是以上所说的阻塞),当下次resume后才会return,并继续左边的赋值操作。

所以yield中的两个参数会在挂起协程后在返回给主程序,并通过resume来return,让主程序获得到coroutine的执行结果。

同理下一次的resume传入的参数会在协程被再次唤醒后,继续执行yield的return并作为参数向左侧赋值。

yield的参数是向外通信的入口,resume的返回是向外通信的出口

resume的参数是向内通信的入口,yield返回时向内通信的出口。

Lua学习——Coroutine协程相关推荐

  1. coroutine协程详解

    前两天阿里巴巴开源了coobjc,没几天就已经2千多star了,我也看了看源码,主要关注的是协程的实现,周末折腾了两整天参照Go的前身libtask和风神的coroutine实现了一部分,也看了一些文 ...

  2. Android MVVM + Retrofit + OkHttp + Coroutine 协程 + Room + 组件化架构的Android应用开发规范化架构

    BaseDemo 介绍 BaseDemo 是Android MVVM + Retrofit + OkHttp + Coroutine 协程 + Room + 组件化架构的Android应用开发规范化架 ...

  3. XLua Coroutine协程

    1.将XLua的util文件 放在自己的项目当中,在require 它 XLua中的位置 移动到你项目的自定义的位置 2.在Lua层 封装XLua的 Corrutine 功能,代码如下 corouti ...

  4. Python 学习笔记 - 协程

    Python里面控制并发,除了多线程和多进程,还可以使用协程(CoRoutine).他是在一个线程内通过程序员人为的指定来进行切换 例1:通过switch()可以人为来回切换到另外一个函数:当所有函数 ...

  5. 利用swoole coroutine协程实现redis异步操作

    <?php #注意:可能会遇到这样的现象,用swoole协程的方法访问常规方法添加到redis中的数据,可能访问不到(直接返回NULL)!这可能是两者采用了不同的技术标准所致!项目中要统一标准 ...

  6. python学习之-- 协程

    协程(coroutine) 也叫:微线程,是一种用户态的轻量级线程,就是在单线程下实现并发的效果. 优点: 1:无需线程上下文切换的开销.(就是函数之间来回切换) 2:无需原子操作锁定及同步的开销.( ...

  7. Thread(线程)、Fiber(纤程)、coroutine(协程) 、绿色线程(GreenThread)

    计算机有进程,线程和协程.前两者大家都知道,很常见的玩意.而协程,则是基于线程之上的,自主开辟的异步任务,很多人更喜欢叫它们纤程(Fiber),或者绿色线程(GreenThread). 进程 为了使多 ...

  8. go学习 --- go协程

    一.go协程与go主线程 Go主线程:一个Go线程上,可以起多个协程,协程是轻量级的线程. 二.go协程特点 1.有独立的栈空间 2.共享程序堆空间 3.调度由用户控制 4.协程是轻量级的线程 三.入 ...

  9. 深入理解lua的协程coroutine

    1. 概述 lua协程和多线程 相同之处:拥有自己独立的桟.局部变量和PC计数器,同时又与其他协程共享全局变量和其他大部分东西 不同之处:一个多线程程序可以同时运行几个线程(并发执行.抢占),而协程却 ...

最新文章

  1. SQL Server 中的事务和锁(三)-Range S-U,X-X 以及死锁
  2. SpringBoot 项目打包部署
  3. pandas 读表格_pandas电子表格的读取(pandas中的read_excel)
  4. java异常自定义返回信息,Spring Boot 如何自定义返回错误码错误信息
  5. 卷积神经网络(CNN)介绍与实践
  6. AndroidStudio_报错PluginApplicationException: Failed to apply plugin [id ‘com.and---Android原生开发工作笔记227
  7. Vue条件渲染---vue工作笔记0008
  8. noapic和acpi=off能帮我做到什么?
  9. pythonos文件目录方法_python12-OS模块(文件/目录方法)
  10. R语言|ggtreeExtra包绘制进化树
  11. 数据读取的常见函数以及区别(fopen、open、textscan、fwrite、fread函数)
  12. qq出示测试软件语音聊天,QQ语音时语音测试时可以听到声音,播放测试语音时听不到,也听不到好友发来的语音,请问怎么处理...
  13. sudo su与su的区别
  14. 如何评价一个人的科研能力
  15. treemap倒叙_java对map进行排序(对日期倒叙)
  16. [周鸿祎] 与其苟且活着,不如奋起抗争
  17. python 爬虫软件第一个程序
  18. byte转16进制字符串<——>16进制转byte
  19. c语言define作用范围,#define的作用(C语言)
  20. Opencv4.0学习记录(Day1 图像读取与显示)

热门文章

  1. 【git】日常维护代码
  2. 云效代码安全揭秘,全方位为代码安全保驾护航
  3. 使用requests+lxml爬取zol桌面壁纸
  4. 树莓派爱好者基地64位系统仓库
  5. Webpack 性能之使用 Cache 提升构建性能
  6. 网易蜂巢基于万节点kubernetes支撑大规模云应用实践
  7. c# 可以设置透明度的 Panel 组件
  8. the following arguments are required: (参数)
  9. 树莓派kali系统ARP断网攻击
  10. 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--VGA(二十)