Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1273848
  • 博文数量: 389
  • 博客积分: 2874
  • 博客等级: 少校
  • 技术积分: 3577
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-24 10:34
文章分类

全部博文(389)

文章存档

2020年(2)

2018年(39)

2017年(27)

2016年(3)

2015年(55)

2014年(92)

2013年(54)

2012年(53)

2011年(64)

分类: Python/Ruby

2012-03-23 17:02:33

《lua程序设计》里管道和过滤器部分 感觉有的地方不能理解,我按照书上的例子运行后出现无限的:cannot resume dead coroutine

后来我将代码修改为如下的部分,就没有问题了。

点击(此处)折叠或打开

  1. function receive(prod)
  2.     local status , value = coroutine.resume(prod)
  3.     return value
  4. end

  5. function send(x)
  6.     coroutine.yield(x)
  7. end

  8. function consumer(prod)
  9.     --while true do
  10.         local x = receive(prod)
  11.         io.write(x,"\n")
  12.     --end
  13. end

  14. function filter(prod)
  15.     return coroutine.create(function ()
  16.     for line = 1,math.huge do
  17.         local x = receive(prod)
  18.         x = string.format("%5d %s" , line ,x)
  19.         send(x)
  20.     end
  21.     end)
  22. end

  23. function producter ()
  24.     return coroutine.create(function ()
  25.         while true do
  26.             local x = io.read()
  27.             send(x)
  28.         end
  29.     end)
  30. end

  31. while true do
  32. p = producter()
  33. q = filter(p)
  34. consumer(q)
  35. end

但是回去思考了一下发现还是不正确,按照上面的修改,每一个循环都创建协同程序,这个就不符合分离原则了。

后来思考了一下发现,其实原来书上的例子没有错误,而是我理解错了,我以为是在一个协同程序没有yield的情况下另一个程序resume他会报错。其实是不会报错的,resume也会等待,直到协同程序yield后才返回。

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