我查看了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秒再恢复而不忙等待?
答案 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
我当然只能回答......呃。