我创建了以下两个协同程序,一个生产者和一个消费者,试图学习/理解协同程序。
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.为什么这不会发生并且是使用协同程序的正确方法?
答案 0 :(得分:2)
一个协程在它产生的同一点(或者就在它之后)恢复,而不是在开头。
printNumber
的代码不会更改number
,因此您获得的输出并不令人惊讶。
要解决此问题,请在number=coroutine.yield()
中使用printNumber
。
传递给resume
的参数由yield
返回。