Почему моя функция вызова хвоста не приостанавливает и сбрасывает вывод?
Я просмотрел справку по функции сна lua-users, пытаясь найти решение для не занятого ожидания, и я не доволен ни одним из них. Тем не менее я попытался использовать несколько, чтобы обеспечить задержку в конце функции, которая использует хвостовые вызовы.
Обычно я бы не использовал хвостовые вызовы, но поскольку 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 секунд, прежде чем возобновить работу без ожидания?
1 ответ
По совету Ника Гаммона я попробовал его решение 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% использования процессора, не отображается поведение вывода.
Моя вторая попытка:
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
На что я могу только ответить... да, конечно.