为什么我的尾调用函数不暂停和刷新输出?
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
对此我只能回复...呃,当然。
我浏览了 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
对此我只能回复...呃,当然。