lua协程实现简析】的更多相关文章

协程,简单来说就是新创建一个协助程序(co = coroutine.create(func)),然后需要手动去启动它(coroutine.resume(co)),在它最终退出之前,它有可能暂停多次返回阶段性的结果(coroutine.yield(co)),每一次暂停之后都必须手动去恢复它(coroutine.resume(co)). 协程在lua源文件中对应lcorolib.c,数组co_funcs中定义了c暴露给lua的接口.从上面的描述看和c函数调用有点相似,只不过c函数只有一个出口,所以不…
协程和一般多线程的区别是,一般多线程由系统决定该哪个线程执行,是抢占式的,而协程是由每个线程自己决定自己什么时候不执行,并把执行权主动交给下一个线程. 协程是用户空间线程,操作系统其存在一无所知,所以需要用户自己去做调度,用来执行协作式多任务非常合适. 线程和协同程序的主要不同在于:在多处理器情况下,多线程程序同时运行多个线程:而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起.这样Lua的协程就不能利用现在多核技术了. (一)Cor…
协程是个很好的东西,它能做的事情与线程相似,区别在于:协程是使用者可控的,有API给使用者来暂停和继续执行,而线程由操作系统内核控制:另 外,协程也更加轻量级.这样,在遇到某些可能阻塞的操作时,可以使用暂停协程让出CPU:而当条件满足时,可以继续执行这个协程.目前在网络服务器领域, 使用Lua协程最好的范例就是ngx_lua了,我自己的项目qnode也是借助Lua协程的概念:每一个qnode中的微进程底层对应一个Lua协程, 这样底层的异步操作可以在使用者使用同步的方式写出来.Coool. 来看…
LUA协程和C#协程非常相似,功能与用法更强大.基础用法: coco = coroutine.create(function (a,b) print("resume args:"..a..","..b) , , ) --第一次调用resume()时执行到此句就返回了,没有执行=赋值操作 --第二次执行resume()操作时,从=号开始继续执行剩余代码,且此时新的调用参数(21,11111)从=号传出给了arg1, arg2 --除了=号传参这一点外,其余都基本与c#…
参考链接: http://www.cnblogs.com/zrtqsk/p/4374360.html 对例子的自我理解: -- 协程的理解 -- co 是协程的内容,类似函数内容, 通过yield 将中止函数的操作, -- 但重新resume后,将继续执行co未执行到内容 function foo(a) print("foo", a) * a) end co = coroutine.create(function ( a, b ) print("co-body",…
print("Lua 协程测试3") -- 实现消费者-生产者关系(生产一个就消费一个) count = -- 生产总数 -- 生产者 local newProductorCo = coroutine.create( --创建协程 function() local i = while(i <= count)do coroutine.yield(i) -- 挂起协程 i = i + end end) -- 消费者 ,count do local status,value = cor…
print("Lua 协程测试2") function testFun(n) print("into foo,n = "..n) * n) -- 挂起co协程 end co = coroutine.create( -- 创建co协程 function(a,b) print("into co 1,a = "..a..",b = "..b) local r = testFun(a) print("into co 2,r…
协程是个很好的东西,它能做的事情与线程相似,区别在于:协程是使用者可控的,有API给使用者来暂停和继续执行,而线程由操作系统内核控制:另外,协程也更加轻量级.这样,在遇到某些可能阻塞的操作时,可以使用暂停协程让出CPU:而当条件满足时,可以继续执行这个协程.目前在网络服务器领域,使用Lua协程最好的范例就是ngx_lua了 来看看Lua协程内部是如何实现的. 本质上,每个Lua协程其实也是对应一个LuaState指针,所以其实它内部也是一个完整的Lua虚拟机-有完整的Lua堆栈结构,函数调用栈等…
一个大胆的尝试:使用巨型lua协程来表示整个“一局”流程. lua协程是一个很另类的功能,有并发的影子但又不是真的并发,所以真正拿它来做大功能框架的范例不多,通常用于一些小型trick式设计.但这次我在大富翁里把它用到了“极致”:整个一局游戏,就是全部跑在一个协程里的! 简单的说:在开始按钮的点击响应函数里(自然是在“主协程”中),创建出用于新一局游戏的“run协程”,然后在这里面启动这一局的while大循环,共3层:第1层为每个回合,第2层为每个玩家,第3层为每个指令.每当要等待一个指令时,r…
协程就是协程,不是线程. CPU执行单位是线程,不是什么协程. 协程,是同步执行,不是并行,只是切了一个上下文了,为你保存原来的上下文而已. 切到第二个协程时,原来的协程处于挂起状态. 这个特指lua的协程. Unity的协程也是这么回事. lua协程例子: local function run(data) print("co-body", 1, data.a) print("co-body", 2, data.a) print("co-body"…