(Lua)为什么我的生产者 - 消费者Lua coroutines实验性没有产生预期的结果?

时间:2015-04-14 12:30:34

标签: lua coroutine

我创建了以下两个协同程序,一个生产者和一个消费者,试图学习/理解协同程序。

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.为什么这不会发生并且是使用协同程序的正确方法?

1 个答案:

答案 0 :(得分:2)

一个协程在它产生的同一点(或者就在它之后)恢复,而不是在开头。

printNumber的代码不会更改number,因此您获得的输出并不令人惊讶。

要解决此问题,请在number=coroutine.yield()中使用printNumber

传递给resume的参数由yield返回。