Создание таймера с использованием Lua

#timer #lua

#таймер #lua

Вопрос:

Я хотел бы создать таймер, используя Lua, таким образом, чтобы я мог указать функцию обратного вызова, которая будет запущена по истечении X секунд.

Какой был бы наилучший способ добиться этого? (Мне нужно загрузить некоторые данные с веб-сервера, которые будут обрабатываться один или два раза в час)

Приветствия.

Ответ №1:

Если точность в миллисекундах не требуется, вы могли бы просто перейти к решению сопрограммы, которое вы периодически возобновляете, например, в конце вашего основного цикла, вот так:

 require 'socket' -- for having a sleep function ( could also use os.execute(sleep 10))
timer = function (time)
    local init = os.time()
    local diff=os.difftime(os.time(),init)
    while diff<time do
        coroutine.yield(diff)
        diff=os.difftime(os.time(),init)
    end
    print( 'Timer timed out at '..time..' seconds!')
end
co=coroutine.create(timer)
coroutine.resume(co,30) -- timer starts here!
while coroutine.status(co)~="dead" do
    print("time passed",select(2,coroutine.resume(co)))
    print('',coroutine.status(co))
    socket.sleep(5)
end
  

При этом используется функция sleep в LuaSocket, вы можете использовать любую другую из альтернатив, предложенных на Lua-users Wiki

Ответ №2:

Попробуйте lalarm , вот:http://www.tecgraf.puc-rio.br /~lhf/ftp/lua/

Пример (на основе src/test.lua):

 -- alarm([secs,[func]])
alarm(1, function() print(2) end); print(1)
  

Вывод:

 1
2
  

Комментарии:

1. Не могли бы вы привести мне пример того, как использовать alarm простым способом для вызова функции каждую минуту?

2. Вы смотрели на код? В архиве lalarm есть файл «test.lua».

3. Невозможно установить два будильника подряд, иначе второй перекрывал бы первый.

Ответ №3:

Если это приемлемо для вас, вы можете попробовать LuaNode. Следующий код устанавливает таймер:

 setInterval(function()
    console.log("I run once a minute")
end, 60000)
process:loop()
  

Ответ №4:

используйте скрипт.Настройка таймера (интервал, функция обратного вызова)

Ответ №5:

После прочтения этой темы и других я решил использовать библиотеку Luv. Вот мое решение:

 uv = require('luv') --luarocks install luv

function set_timeout(timeout, callback)
  local timer = uv.new_timer()
  local function ontimeout()
    uv.timer_stop(timer)
    uv.close(timer)
    callback()
  end
  uv.timer_start(timer, timeout, 0, ontimeout)
  return timer
end


set_timeout(1000, function() print('ok') end) -- time in ms

uv.run() --it will hold at this point until every timer have finished
  

Ответ №6:

В моем Debian я установил пакет lua-lgi, чтобы получить доступ к библиотекам на основе GObject.

Следующий код демонстрирует использование, демонстрирующее, что вы можете использовать несколько асинхронных обратных вызовов:

 local lgi = require 'lgi'
local GLib = lgi.GLib

-- Get the main loop object that handles all the events
local main_loop = GLib.MainLoop()

cnt = 0
function tictac()
     cnt = cnt   1
     print("tic")
     -- This callback will be called until the condition is true
     return cnt < 10
end

-- Call tictac function every 2 senconds
GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 2, tictac)

-- You can also use an anonymous function like that
GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 1,
                         function()
                            print( "There have been ", cnt, "tic")
                            -- This callback will never stop
                            return true
                         end)

-- Once everything is setup, you can start the main loop
main_loop:run()

-- Next instructions will be still interpreted
print("Main loop is running")
  

Вы можете найти больше документации о LGI здесь