我创建了以下两个协同,一个生产者和一个消费者,试图学习/理解协同。
function count01to10()
for i = 1, 10 do
coroutine.yield(i)
end
end
function printNumber(number)
while number ~= nil do
print("Counter: ", number)
coroutine.yield()
end
end
function main()
local number = 0
print("Creating coroutines")
local counter = coroutine.create(count01to10)
local printer = coroutine.create(printNumber)
print("Executing coroutines")
while (10 > number) do
isSuccessuful, number = coroutine.resume(counter)
print("counter: ", coroutine.status(counter))
coroutine.resume(printer, number)
print("printer: ", coroutine.status(printer))
end
print("Finished")
end
main()产出如下:
Creating coroutines
Executing coroutines
counter: suspended
Counter: 1
printer: suspended
counter: suspended
Counter: 1
printer: suspended
...
Counter: 1
printer: suspended
Finished我希望输出输出能打印出数字1到10。为什么这不会发生,这是使用协同线的正确方法吗?
发布于 2015-04-14 12:40:52
协同线在产生(或刚开始时)的同一点恢复,而不是在开始时。
您的printNumber代码不会更改number,因此您得到的输出并不令人惊讶。
要解决这个问题,请在number=coroutine.yield()中使用printNumber。
传递给resume的参数由yield返回。
https://stackoverflow.com/questions/29627379
复制相似问题