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协程是非抢占式的多线程,必须手动在不同的协程间切换,且同一时 ...
随机推荐
- IE11在使用get方式提交没有进行请求的bug问题
在做iemsc项目的时候,测试提交了一个bug问题,在发布新闻成功后,自动刷新列表的时候,不进行刷新,但是在谷歌上面又不会出现这种问题, 原因: 发现请求的时候用的get请求,因为不同的浏览器的请求机 ...
- <? extends A> 和 <? super A> 的意思
/** * @author Lee Boynton * @author Arthur van Hoff * @author Martin Buchholz * @author Ulf Zibis * ...
- ZOJ 2856 Happy Life
Problem Description Do you know Utopia? It's a perfect world in which everyone leads a happy life. A ...
- StrangeIoc框架学习
StrangeIoc是一款基于MVCS的一种框架,是对MVC思想的扩展,是专门针对Unity3D开发的一款框架,非常好用. 一.MVCS分别代表什么 MVCS框架是一种模块的分离,一种写代码的规则,目 ...
- window.history,页面中的返回按钮
一.页面中的返回按钮事件 window.history可以不加window这个前缀 他的方法有: window.history.go(-1); //-n表示后退n页,n表示前进n页,或者是一个url ...
- group by 语句
user E_book go 这样的程序会出错,因为play没有使用sum,所以要分组. group by play 有函数的和没有函数的表一起使用要用 GROUP BY .AVG 求平均值,只能与数 ...
- VirtualBox使用Centos7与主机共享文件夹
最近使用VitrtualBox安装Centos7学习,liunx脚本和一些命令,经过一些研究完成了虚拟机与 主机共享文件夹,虚拟机链接外部网络,主机与虚拟机互相通信.在其中遇到一些我解决的技术问题记录 ...
- Javascript获取页面表格中的数据
var main=mygrid.gettable("11"); //表示获取非固定列的表格 var main1=mygrid.gettable("01");// ...
- zoj 3524(拓扑排序+多重背包)(好题)
http://blog.csdn.net/woshi250hua/article/details/7824773 题目大意:从前有n座山,山里都有一座庙,庙里都有一个老和尚,老和尚专送纪念品,每个纪念 ...
- POJ 2955 Brackets 区间DP 最大括号匹配
http://blog.csdn.net/libin56842/article/details/9673239 http://www.cnblogs.com/ACMan/archive/2012/08 ...