(Lua) 为什么我的生产者-消费者 Lua 协程实验没有产生预期的结果?
(Lua) Why is my producer-consumer Lua coroutines experiment not yielding the expected resault?
我创建了以下两个协同程序,一个生产者和一个消费者,试图 learn/understand 协同程序。
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。为什么这没有发生,这是使用协程的正确方法吗?
协程在它产生的同一点恢复(或刚好在它之后),而不是在开始处。
你的 printNumber
代码没有改变 number
,所以你得到的输出并不奇怪。
要解决此问题,请在 printNumber
中使用 number=coroutine.yield()
。
传递给 resume
的参数由 yield
返回。
我创建了以下两个协同程序,一个生产者和一个消费者,试图 learn/understand 协同程序。
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。为什么这没有发生,这是使用协程的正确方法吗?
协程在它产生的同一点恢复(或刚好在它之后),而不是在开始处。
你的 printNumber
代码没有改变 number
,所以你得到的输出并不奇怪。
要解决此问题,请在 printNumber
中使用 number=coroutine.yield()
。
传递给 resume
的参数由 yield
返回。