为什么我的尾调用函数没有暂停和刷新输出?

时间:2015-10-16 03:17:24

标签: lua sleep busy-waiting tail-call

我查看了lua-users Sleep Function引用,试图找到一个非繁忙的等待解决睡眠问题的方法,我对其中任何一个都不满意。尽管如此,我尝试使用几个在使用尾调用的函数结束时提供延迟。

通常情况下我不会使用尾调用,但由于lua不会为尾调用留下堆栈,所以它适合我。

不幸的是,我发现处理器的使用率达到了大约20%,并且一旦开始,程序就会立即无响应而没有任何刷新输出。

问题(简​​化)如下所示:

function myFunc ()
   -- do some stuff
   -- lots of snazzy logic and function calls
   -- heck, throw in a few prints
   print "Going to sleep"
   -- sleep for a bit
   os.execute("sleep 10")
   print "Waking up"
   -- tail call
   return myFunc()
end

我已经尝试过socket select方法,os.execute当然忙着等待。其中只有繁忙的等待才能产生预期的行为。

这些其他非繁忙的等待解决方案是否也是非阻塞的?即使有延迟,他们是否允许尾部调用处理?

如何刷新输出并让功能等待10秒再恢复而不忙等待?

1 个答案:

答案 0 :(得分:0)

On the advice of Nick Gammon我尝试了他的wait.lua解决方案。我最初的尝试:

function controlLoop()
   wait.make (
      function()
         world.Note("Hello world.") -- essentially print
        wait.time(10)
     end
   )
   world.Note("Goodbye world.") -- essentially print
  return controlLoop()
end

完全相同的100%CPU使用,没有输出显示行为。

我的第二次尝试:

function controlLoop()
   wait.make (
      function()
         world.Note("Hello world.")
         wait.time(10)
         world.Note("Goodbye world.")
         return controlLoop()
      end
   )
end

已经跑了3个小时没有错。我确实使用debug.traceback()对堆栈跟踪进行了调试调用,并且从未得到超过1级深度的响应。另外,观察窗口内存使用过程,它在3小时内没有增加。

我很高兴我有一个解决方案,但我仍然有些不高兴,因为我不明白为什么它有效以及为什么原始版本失败。

有人向我指出,我患有隧道视觉,并且一个循环将解决我的问题。

function controlLoop()
   wait.make (
      function()
         while true do
            world.Note("Hello world.")
            wait.time(10)
            world.Note("Goodbye world.")
         end -- loop
      end
   )
end

我当然只能回答......呃。