《lua程序设计》里管道和过滤器部分 感觉有的地方不能理解,我按照书上的例子运行后出现无限的:cannot resume dead coroutine
后来我将代码修改为如下的部分,就没有问题了。
- function receive(prod)
- local status , value = coroutine.resume(prod)
- return value
- end
- function send(x)
- coroutine.yield(x)
- end
- function consumer(prod)
- --while true do
- local x = receive(prod)
- io.write(x,"\n")
- --end
- end
- function filter(prod)
- return coroutine.create(function ()
- for line = 1,math.huge do
- local x = receive(prod)
- x = string.format("%5d %s" , line ,x)
- send(x)
- end
- end)
- end
- function producter ()
- return coroutine.create(function ()
- while true do
- local x = io.read()
- send(x)
- end
- end)
- end
- while true do
- p = producter()
- q = filter(p)
- consumer(q)
- end
但是回去思考了一下发现还是不正确,按照上面的修改,每一个循环都创建协同程序,这个就不符合分离原则了。
后来思考了一下发现,其实原来书上的例子没有错误,而是我理解错了,我以为是在一个协同程序没有yield的情况下另一个程序resume他会报错。其实是不会报错的,resume也会等待,直到协同程序yield后才返回。
阅读(2122) | 评论(0) | 转发(0) |