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

Why does my tail calling function not pause and flush output?

我浏览了 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

socketselect方法我试过了,os.execute当然忙等待。其中只有忙等待给出了预期的行为。

这些其他的非忙等待解决方案也是非阻塞的吗?那就是尽管有延迟,他们是否允许处理尾调用?

如何刷新输出并让函数等待 10 秒后再恢复而不忙等待?

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 级深度的响应。此外还观察了进程的 Window 内存使用情况,它在 3 小时内没有增加。

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

有人向我指出,我的视野很狭窄,while 循环可以很好地解决我的问题。

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

对此我只能回复...呃,当然。