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: 在心情不是很好的时候,尽然能学习一小阵子也算不错了,鼓励一下自己。^_^