使用Lua创建一个定时器

我想使用Lua创建一个定时器,方式是我可以指定一个回调函数,在X秒后触发。

怎样最好地实现这一点?(我需要从Web服务器下载一些数据,每小时解析一到两次)

欢呼。

原文链接 https://stackoverflow.com/questions/6118799

点赞
stackoverflow用户4323
stackoverflow用户4323

请尝试使用 lalarmhttp://www.tecgraf.puc-rio.br/~lhf/ftp/lua/

示例(基于 src/test.lua):

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

输出:

1
2
2011-05-25 02:49:28
stackoverflow用户44740
stackoverflow用户44740

如果可以接受的话,你可以尝试 LuaNode。以下代码设置了一个计时器:

setInterval(function()
    console.log("I run once a minute")
end, 60000)
process:loop()
2011-05-25 03:19:45
stackoverflow用户513763
stackoverflow用户513763

如果不需要毫秒级准确度,你可以选择协程解决方案,在你的主循环结束时定期恢复它,像这样:

require 'socket' -- 用于拥有睡眠函数(也可以使用 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) -- 计时器从这里开始!
while coroutine.status(co)~="dead" do
    print("time passed",select(2,coroutine.resume(co)))
    print('',coroutine.status(co))
    socket.sleep(5)
end

这种方法使用了 LuaSocket 中的睡眠函数,你可以在 Lua-users Wiki 上选择任何其他的可用方案。

2011-05-25 09:05:36
stackoverflow用户2371030
stackoverflow用户2371030

使用 Script.SetTimer(interval, callbackFunction)

2013-05-10 17:56:20
stackoverflow用户364942
stackoverflow用户364942

阅读了这篇帖子和其他帖子后,我决定使用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) --时间单位为毫秒

uv.run() --此处将会保持,直到所有计时器完成
2019-02-05 20:55:26
stackoverflow用户1267600
stackoverflow用户1267600

在我的 Debian 上,我安装了 lua-lgi 软件包来访问基于 GObject 的库。

下面的代码展示了一个演示,说明可以使用少量异步回调:

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

-- 获取处理所有事件的主循环对象
local main_loop = GLib.MainLoop()

cnt = 0
function tictac()
     cnt = cnt + 1
     print("tic")
     -- 直到条件为真,该回调将被调用
     return cnt < 10
end

-- 每 2 秒钟调用 tictac 函数一次
GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 2, tictac)

-- 您还可以像这样使用匿名函数
GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 1,
                         function()
                            print("共有", cnt, "个 tic")
                            -- 该回调将永不停止
                            return true
                         end)

-- 设置完成后,您可以启动主循环
main_loop:run()

-- 下一步指令仍将被解释
print("主循环正在运行")

您可以在这里找到有关 LGI 的更多文档

2020-04-07 10:32:06