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. ubuntu 18 常用软件安装

    主要内容 1.安装 Ubuntu 18.04 LTS 2.安装 Google Chrome 3.安装 OpenVPN Client 4.安装 Docker CE 5.安装 MySQL Server 转 ...

  2. (转)python之os,sys模块详解

    python之sys模块详解 原文:http://www.cnblogs.com/cherishry/p/5725184.html sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和 ...

  3. Python基础(8) - 模块

    Python 模块的物理形式就是文件:一个文件对应一个模块.文件名就是模块名+.py 模块定义了自己独有的命名空间.在其定义的属性,函数,类都隶属于该空间. 通过import关键字我们可以导入模块: ...

  4. Ajax嵌套Ajax的模版

    引入 在开发中,难免会碰到需要发送两次ajax请求或者更多的情况 情境:我们需要resultB数据,后台提供的接口要先传入参数paramA,获取到resultA,然后resultA作为参数,调用另外一 ...

  5. 结对练习——Caculator

    本人:学号201521031045,码云https://gitee.com/L_Name 小伙伴:暂无 项目fork: https://gitee.com/L_Name/Calculator CalS ...

  6. bzoj 3512: DZY Loves Math IV

    Description 给定n,m,求 模10^9+7的值. Solution 设 \(S(n,m)\) 表示 \(\sum_{i=1}^{m}\phi(n*i)\) \(Ans=\sum_{i=1} ...

  7. 借助 CORS 从 JavaScript 使用 API 应用

    应用服务提供内置的跨域资源共享 (CORS) 支持,可让 JavaScript 客户端对 API 应用中托管的 API 进行跨域调用.应用服务允许配置对 API 的 CORS 访问,无需在 API 中 ...

  8. getElementsByName属性

    getElementsByName() 方法可返回带有指定名称的对象的集合 语法 document.getElementsByName(name) 该方法与 getElementById() 方法相似 ...

  9. 改善Java程序的151个建议(1-4)

    1.不要在常量和变量中出现易混淆的数字 个人感觉这条在于编程命名的规范性.代码除了给机器看,也要给人看.要写能够结构清晰,命名规范,让人看懂的代码. 字母l作为长整型标志时务必大写 L 2.莫让常量蜕 ...

  10. 关于display:inline-block布局导致错位问题分析

    移动端设计稿需求是这样的,如下图: 未知的几个头像从左至右并行居中排列. 一般可能直接使用float,但是设计图要求头像排列始终是居中的,于是想到要让它们成为行内元素,然后可使用的方法有flex bo ...