我想在 Go 中以不少于给定时间间隔执行一个函数,以一次调用开始到下一次调用开始为衡量标准。函数本身的执行时间会有所不同。
如果该函数运行的时间超过该间隔,我想立即再次运行它。但是如果/当它最终在不到一个完整的间隔内恢复完成时,我希望它立即恢复等待直到下一个间隔边界。
对于上下文,这是一个速率限制器——被调用的函数可以很容易地让 CPU 旋转,但它不会产生额外的价值,因为它正在与不可能快速反应的人进行交互。
为清楚起见的示例(interval == 20ms例如):
runtime: 15ms
wait: 5ms
runtime: 25ms
wait: 0ms
runtime: 25ms
wait: 0ms
runtime: 15ms
wait: 5ms <-- this is the important bit
如果我使用time.Ticker,我相信额外的“滴答”将在通道中排队Ticker.C(如果它被缓冲)导致它在恢复时立即进行一堆调用,或者 Ticker 的编写器将阻止写入通道并结束恢复后第一次调用的延迟过长。
现在我正在做一些数学运算,这是有效的,但感觉它可能不符合惯用语:
minDurationBetweenRuns := time.Millisecond * 100
for {
lastRunTime := time.Now()
DO_STUFF_HERE()
durationSinceLastRun := time.Now().Sub(lastRunTime)
if durationSinceLastRun < minDurationBetweenRuns {
sleepTime := minDurationBetweenRuns - durationSinceLastRun
if sleepTime > minDurationBetweenRuns {
sleepTime = minDurationBetweenRuns
}
time.Sleep(sleepTime)
}
}
斯蒂芬大帝
相关分类