Chinaunix首页 | 论坛 | 博客
  • 博客访问: 397434
  • 博文数量: 81
  • 博客积分: 45
  • 博客等级: 民兵
  • 技术积分: 608
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-22 11:46
个人简介

一个愤青

文章分类

全部博文(81)

文章存档

2015年(40)

2014年(29)

2013年(11)

2012年(1)

我的朋友

分类: LINUX

2014-03-16 21:55:13

感觉programing in lua书中这块讲的不太清楚,自己理解了半天,因此写出来

点击(此处)折叠或打开

  1. local co = coroutine.create(function (...)
  2.              print("arg: ", ...)
  3.              print("yield return: ", coroutine.yield(100, ...))
  4.              return "coroutine end"
  5.              end)
  6. print("resume 1: ", coroutine.resume(co, 1, 2, 3))
  7. print("resume 2: ", coroutine.resume(co, 4, 5, 6))

如上代码,
第一次调用resume的时候程序没有yield在等,因此resume除co以外的参数都传递给协同主程序,因此执行打印:arg: 1 2 3
然后执行到yield后程序suspended, 并且yield通过自己的参数和resume它的程序交换数据,所以第一次调用的resume返回了yield的参数,所以打印出:
resume 1: 100 1 2 3
第二次调用resume的时候程序有yield在等,因此resume(co, 4, 5, 6)除co以外的参数都传递给这个yield,因此yield返回了resume的这些参数,程序打印:
yield return: 4 5 6, 最后执行return 语句,结束整个协同程序,最中结果返回resume调用,因此打印:resume 2: coroutine end
这样,lua就通过一对resume和yield实现了协同程序的数据交换

上面事例代码结果为:

点击(此处)折叠或打开

  1. lua $ lua coroutine6.lua
  2. arg: 1 2 3
  3. resume 1: true 100 1 2 3
  4. yield return: 4 5 6
  5. resume 2: true coroutine end
注:resume以保护模式运行,返回ture和运行结果或false和错误信息


阅读(5267) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~