2

我查看了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

我已经尝试过套接字选择方法,os.execute,当然还有忙等待。其中只有忙碌的等待给出了预期的行为。

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

如何刷新输出并让函数在恢复之前等待 10 秒而不忙于等待?

4

1 回答 1

0

在 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

我只能回答……当然,呵呵。

于 2015-10-17T21:13:19.487 回答