Lua的协同程序初探
Content:
前两天把Lua的协同程序概念看了一下,不是很懂,只能说《Programming In Lua》中把它解释成线程让人很好的理解起来,但是真正去看的时候,收获并不是很大。第一个例子是消费者和生产者的例子,就没有怎么看懂。生产者-消费者问题是在学操作系统的时候学的,感觉基本概念还是明白的。Lua这本书首先给了这样一个例子,虽然说是消费者驱动,很简单的一个例子其实有好几点都是第一次不能理解的,这里总结一下,自己记录一些东西。
1. 源程序
function producer()
while true do
local x = io.read()
send(x)
end
end function consumer()
while true do
local x = receive()
io.write(x, "\n")
end
end function receive()
return coroutine.resume(producer)
end function send(x)
coroutine.yield(x)
end
当你试着写两行代码执行的时候,首先你要记得把上面两个函数修改成协同程序create的形式【我等菜鸟容易犯2】
coroutine.resume(producer)
coroutine.resume(consumer)
你会发现你输入第一个值得时候(eg:5),结果什么也没打印。之后你再输入的时候就没有问题了,这是为什么呢?也就是这个问题,让我对这个小例子有了新的认识,也对yield和resume函数有了进一步的认识。^_^
2. 初探
producer = coroutine.create(function ()
while true do
local x = io.read()
print("before send(yield)")
send(x)
print("after send(yield)")
end
end) consumer = coroutine.create(function()
while true do
print("before resume")
local s, v = receive()
if s then
io.write(v, "\n")
print("after resume1")
end
print("after resume2")
end
end)
print("start............")
coroutine.resume(producer)
coroutine.resume(consumer)
修改了producer和consumer两个函数的书写形式,并加入了几行打印信息,结果如下:

看完这个结果,你也差不多能够理解为什么第一次没有打印和后面打印的一系列情况。
3.总结
总结一下自己的认识:
(1)read函数会阻塞;
(2)receive(resume)函数也会阻塞,resume的返回值来源于两个(yield的参数和函数的最终返回值)【个人理解,请大侠指点】;
(3)yield会挂起程序,但是不会阻塞在那里;
Time:2014/01/18
Tip: 在心情不是很好的时候,尽然能学习一小阵子也算不错了,鼓励一下自己。^_^
Lua的协同程序初探的更多相关文章
- 【笨木头Lua专栏】基础补充07:协同程序初探
哎.周五晚上我都还这么努力看书.真是好孩子.(小若:不想吐槽了) 事实上我都准备rs=1&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F17 ...
- Lua学习笔记4. coroutine协同程序和文件I/O、错误处理
Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...
- Lua中的协同程序
[前言] 协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西.从概念上讲,线程与协同程序的主要区别在于,一个具有多个线程的 ...
- 《Lua程序设计》9.1 协同程序基础 学习笔记
协同程序(coroutine)与线程(thread)差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和指令指针,同时又与其他协同程序共享全局变量和其他大部分东西.从概念上讲线程与协同程序的主要区 ...
- lua 15 协程-协同程序
转自:http://www.runoob.com/lua/lua-coroutine.html 什么是协同(coroutine)? Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈 ...
- Lua 协同程序(coroutine)
什么是协同(coroutine)? Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西. 协同是非常 ...
- chapter9_1 协同程序
协同程序与线程差不多,也就是一条执行序列:有自己独立的栈.局部变量.指令指针,以及和其他协同程序共享的全局变量和其他大部分东西. 两者区别在于:一个多线程的程序可以同时运行几个线程,而协同程序却需要彼 ...
- Lua 学习笔记(九)协同程序(线程thread)
协同程序与线程thread差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和命令指针,同时又与其他协同程序共享全局变量和其他大部分东西.从概念上讲线程与协同程序的主要区别在于,一个具有多个线程的 ...
- Lua中的协同程序 coroutine
Lua中的协程和多线程很相似,每一个协程有自己的堆栈,自己的局部变量,可以通过yield-resume实现在协程间的切换.不同之处是:Lua协程是非抢占式的多线程,必须手动在不同的协程间切换,且同一时 ...
随机推荐
- Hibernate的抓取策略(优化)
延迟加载的概述 什么是延迟加载 延迟加载:lazy(懒加载).执行到该行代码的时候,不会发送语句去进行查询,在真正使用这个对象的属性的时候才会发送SQL语句进行查询. 延迟加载的分类 l 类级别的延 ...
- CSS3 pointer-events:none应用举例及扩展
一.pointer-events:none是? pointer-events是CSS3中又一冉冉的属性,其支持的值牛毛般多,不过大多都与SVG相关,我们可以不用理会.当下,对于偶们来讲,与SVG划开界 ...
- 编译impala2.0.0
使用redhat5.8没编译成功,改用redhat6.4最终编译成功. 参考官方的文档https://github.com/cloudera/Impala/tree/v1.2.2 不知道官方的read ...
- cs端调用webApi
public class Httphelper { public static string Post1(string url, string postString) { using (WebClie ...
- [转]angularjs之ui-grid 使用详解
本文转自:http://blog.csdn.net/qhkabuqiluo/article/details/52237710 最近一段时间在使用angularjs 然后就找到ui-grid 这个比较不 ...
- Echarts 修改折线的颜色和折线的点的大小方法
series: [{ type: 'line', smooth:true,//折点是圆弧状的 showSymbol: true, ...
- github上传的项目代码语言类型修改
我们在访问gitHub的时候,经常会看到如下的语言标记,那么这个是如何设置的呢,下面我就整理下具体的操作步骤: 首先在项目根目录下创建一个文件,文件名为.gitattributes 文件内容为: *. ...
- Description Resource Path Location Type web.xml is missing and <failOnMissingWebXml> is set to true
点击Deployment Descriptor 选择Generate Deployment Descriptor Stub. 就会在 src/main/webapp 生成WEB-INF并且有web.x ...
- MySql数据快速导入
使用LOAD DATA INFILE 插入速度可以提升很多 左侧是直接导入100W花费135s ,Dos界面通过Load方式导入450W只用时23s,性能一下子显示出来了.
- poj 3260 最少硬币(01+多重+完全背包)
http://www.cnblogs.com/ACMan/archive/2012/08/14/2637437.html #include <iostream> #include < ...