在Lua中递增os.clock()。

摘要: 我能否让时间(表面上)在我的脚本中流逝,而不是忙等待?使用 os.execute('sleep 1') 不能解决问题(还浪费时间)。

详情:

我有一个库进行特定时间间隔的工作。我目前通过将表插入按时间排序的列表中来计划这个库。大致而言:

local delayedWork = {}
function handleLater( data, delaySeconds )
  local delayedItem = { data=data, execTime=os.clock() + delaySeconds }
  local i=1
  for _,existing in ipairs(delayedWork) do
    if existing.execTime > delayedItem.execTime then break else i=i+1 end
  end
  table.insert(delayedWork,i,delayedItem)
end

稍后,我会定期检查是否有工作要做。大致如下:

function processDelayedWork()
  local i,last = 1,#delayedWork
  while i<=last do
    local delayedItem = delayedWork[i]
    if delayedItem.execTime <= os.clock() then
      table.remove(delayedWork,i)
      -- use delayedItem.data
      last = last-1
    else
      i=i+1
    end
  end
end

(这使用 CPU 时间而不是墙钟时间的事实是另一个问题。我反复在处理期间移动数组而不是一个紧凑的操作是一个不相关的优化。)

当我正在运行系统的单元测试时,我需要让时间过去,最好比正常更快。但是,调用 os.execute('sleep 1') 消耗一个墙钟秒,但不会导致 os.clock() 增加。

$ lua -e "require 'os' print(os.clock()) os.execute('sleep 1') print(os.clock())"
0.002493
0.002799

我无法使用 os.time() 因为这只有整数秒数(在编译为使用数字的 float 而不是 double 的系统上小于这些数字):

$ lua -e "require 'os' print(os.time()) os.execute('sleep 0.4') print(os.time())"
1397704209
1397704209

我能否在不忙等待的情况下强制时间流逝我的脚本?

点赞
用户501459
用户501459

Paul已经回答过这个问题了:让 os.clock 返回你需要的内容。

我添加了一个实现,可以让你控制 os.clock 报告的时间流逝速度。

do
    local realclock = os.clock
    local lasttime = realclock()
    local faketime = lasttime
    local clockMultiplier = 1

    function setClockMultiplier(multiplier)
        clockMultiplier = multiplier
    end

    function adjustTime(offsetAmount)
        faketime = faketime + offsetAmount
    end

    function os.clock()
        local now = realclock()
        adjustTime((now - lasttime) * clockMultiplier)
        lasttime = now
        return faketime
    end
end

现在你可以调用 setClockMultiplier 自由减缓或加速 os.clock 汇报的时间流逝。你也可以通过调用 adjustTime 方法,让时钟向前或向后移动任意数量。

2014-04-17 03:42:33
用户1442917
用户1442917

为什么不编写您自己的时钟函数来实现您想要的功能?

do
   local clock = os.clock
   local increment = 0
   os.clock = function(inc)
     increment = increment + (inc or 0)
     return clock()+increment
   end
end
print(os.clock())
os.clock(1)
print(os.clock())

这将输出 0.001 1.001 或类似的内容。

2014-04-17 04:40:58