Lua学习——Coroutine协程
在菜鸟教程学习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协程相关推荐
- coroutine协程详解
前两天阿里巴巴开源了coobjc,没几天就已经2千多star了,我也看了看源码,主要关注的是协程的实现,周末折腾了两整天参照Go的前身libtask和风神的coroutine实现了一部分,也看了一些文 ...
- Android MVVM + Retrofit + OkHttp + Coroutine 协程 + Room + 组件化架构的Android应用开发规范化架构
BaseDemo 介绍 BaseDemo 是Android MVVM + Retrofit + OkHttp + Coroutine 协程 + Room + 组件化架构的Android应用开发规范化架 ...
- XLua Coroutine协程
1.将XLua的util文件 放在自己的项目当中,在require 它 XLua中的位置 移动到你项目的自定义的位置 2.在Lua层 封装XLua的 Corrutine 功能,代码如下 corouti ...
- Python 学习笔记 - 协程
Python里面控制并发,除了多线程和多进程,还可以使用协程(CoRoutine).他是在一个线程内通过程序员人为的指定来进行切换 例1:通过switch()可以人为来回切换到另外一个函数:当所有函数 ...
- 利用swoole coroutine协程实现redis异步操作
<?php #注意:可能会遇到这样的现象,用swoole协程的方法访问常规方法添加到redis中的数据,可能访问不到(直接返回NULL)!这可能是两者采用了不同的技术标准所致!项目中要统一标准 ...
- python学习之-- 协程
协程(coroutine) 也叫:微线程,是一种用户态的轻量级线程,就是在单线程下实现并发的效果. 优点: 1:无需线程上下文切换的开销.(就是函数之间来回切换) 2:无需原子操作锁定及同步的开销.( ...
- Thread(线程)、Fiber(纤程)、coroutine(协程) 、绿色线程(GreenThread)
计算机有进程,线程和协程.前两者大家都知道,很常见的玩意.而协程,则是基于线程之上的,自主开辟的异步任务,很多人更喜欢叫它们纤程(Fiber),或者绿色线程(GreenThread). 进程 为了使多 ...
- go学习 --- go协程
一.go协程与go主线程 Go主线程:一个Go线程上,可以起多个协程,协程是轻量级的线程. 二.go协程特点 1.有独立的栈空间 2.共享程序堆空间 3.调度由用户控制 4.协程是轻量级的线程 三.入 ...
- 深入理解lua的协程coroutine
1. 概述 lua协程和多线程 相同之处:拥有自己独立的桟.局部变量和PC计数器,同时又与其他协程共享全局变量和其他大部分东西 不同之处:一个多线程程序可以同时运行几个线程(并发执行.抢占),而协程却 ...
最新文章
- SQL Server 中的事务和锁(三)-Range S-U,X-X 以及死锁
- SpringBoot 项目打包部署
- pandas 读表格_pandas电子表格的读取(pandas中的read_excel)
- java异常自定义返回信息,Spring Boot 如何自定义返回错误码错误信息
- 卷积神经网络(CNN)介绍与实践
- AndroidStudio_报错PluginApplicationException: Failed to apply plugin [id ‘com.and---Android原生开发工作笔记227
- Vue条件渲染---vue工作笔记0008
- noapic和acpi=off能帮我做到什么?
- pythonos文件目录方法_python12-OS模块(文件/目录方法)
- R语言|ggtreeExtra包绘制进化树
- 数据读取的常见函数以及区别(fopen、open、textscan、fwrite、fread函数)
- qq出示测试软件语音聊天,QQ语音时语音测试时可以听到声音,播放测试语音时听不到,也听不到好友发来的语音,请问怎么处理...
- sudo su与su的区别
- 如何评价一个人的科研能力
- treemap倒叙_java对map进行排序(对日期倒叙)
- [周鸿祎] 与其苟且活着,不如奋起抗争
- python 爬虫软件第一个程序
- byte转16进制字符串<——>16进制转byte
- c语言define作用范围,#define的作用(C语言)
- Opencv4.0学习记录(Day1 图像读取与显示)