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的协同程序初探的更多相关文章

  1. 【笨木头Lua专栏】基础补充07:协同程序初探

    哎.周五晚上我都还这么努力看书.真是好孩子.(小若:不想吐槽了) 事实上我都准备rs=1&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F17 ...

  2. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

  3. Lua中的协同程序

    [前言] 协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西.从概念上讲,线程与协同程序的主要区别在于,一个具有多个线程的 ...

  4. 《Lua程序设计》9.1 协同程序基础 学习笔记

    协同程序(coroutine)与线程(thread)差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和指令指针,同时又与其他协同程序共享全局变量和其他大部分东西.从概念上讲线程与协同程序的主要区 ...

  5. lua 15 协程-协同程序

    转自:http://www.runoob.com/lua/lua-coroutine.html 什么是协同(coroutine)? Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈 ...

  6. Lua 协同程序(coroutine)

    什么是协同(coroutine)? Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西. 协同是非常 ...

  7. chapter9_1 协同程序

    协同程序与线程差不多,也就是一条执行序列:有自己独立的栈.局部变量.指令指针,以及和其他协同程序共享的全局变量和其他大部分东西. 两者区别在于:一个多线程的程序可以同时运行几个线程,而协同程序却需要彼 ...

  8. Lua 学习笔记(九)协同程序(线程thread)

    协同程序与线程thread差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和命令指针,同时又与其他协同程序共享全局变量和其他大部分东西.从概念上讲线程与协同程序的主要区别在于,一个具有多个线程的 ...

  9. Lua中的协同程序 coroutine

    Lua中的协程和多线程很相似,每一个协程有自己的堆栈,自己的局部变量,可以通过yield-resume实现在协程间的切换.不同之处是:Lua协程是非抢占式的多线程,必须手动在不同的协程间切换,且同一时 ...

随机推荐

  1. Unity5 2D Animation

    1. 所有的动画保存在 .anim 后缀的文件里.2. Animation 标签用来编辑一堆 Animation clip,每一个clip是一个图片序列,也就是动图.动画的最小控制单位就是clip,一 ...

  2. (转)nmon和nmon analyser的下载和使用

    原文:https://blog.csdn.net/a7442358/article/details/50186283 nmon 工具可以为 AIX 和 Linux 性能专家提供监视和分析性能数据的功能 ...

  3. 再探php

    1. 如何打开一个php文件? 启动本地服务器和MySQL, 然后将php文件放在xampp -> htdocs  目录下(可以是子目录.孙子目录 ......),打开浏览器,在浏览器中输入 l ...

  4. StringUtils 中 isEmpty 和 isBlank 的区别

    在项目的工作学习中经常用到了 apache  commons 中的 StringUtils 的 isBlank 和 isEmpty 来判断字符串是否为空,这个方法都是判断字符串是否为空做判断的,以至于 ...

  5. hibernate的中的查询与级联操作

    1.Criteria查询接口适用于组合多个限制条件来搜索一个查询集. 要使用Criteria,需要遵循以下步骤: *创建查询接口: Criteria criteria=session.createCr ...

  6. Hibernate查询所有数据的操作

    Hibernate查询所有数据的操作方式有三种. 1.Query (1)使用该方法查询时,不需要编写sql语句,但是需要编写hql(Hibernate Query Language)语句,该语句是Hi ...

  7. 查找正序排列的List中缺失的日期数据的一个算法

    Code: public List<DateTime> getMissDateData() { DateTime[] keys = { DateTime.Now.AddDays(-5), ...

  8. 浅谈MES系统SMT的JIT功能(二):JIT流程

    上周说到JIT的原理,今天就说说JIT功能的基本流程:从维护基本信息——>生产人员排程——>仓库人员发料——>生产上料——>JIT物料配送看板拉到仓库人员发第二次料,循环上料发 ...

  9. 使用eclipse创建maven web项目

    1.新建项目: 2.选择模板: 3.输入项目信息: 4.新建的项目结构,发现index.jsp报错,直接删除重新创建一个index.jsp文件后,发现仍然报错,再在pom/xml文件中添加相应的ser ...

  10. 前端标注软件-pxcook像素大厨使用心得

    我们在日常开发过程中,设计师给提供的UI图,经常需要标注尺寸,有时候设计师难免会遗漏标注,这样就会大大的增加我们的沟通成本,因此,使用一款好用的标注软件就尤为重要,我推荐这款标注软件---pxcook ...