【问题标题】:Using Ticker for polling an API in Go在 Go 中使用 Ticker 轮询 API
【发布时间】:2022-01-20 19:11:18
【问题描述】:

我需要定期轮询一个 API 以检查状态消息。

ticker := time.NewTicker(time.Second * tickerWaitTimeSeconds)
defer ticker.Stop()

for range ticker.C {
        res, err := r.client.Get(someURL)
        if err != nil {
            results <- err
            return
        }
        if err := json.NewDecoder(res.Body).Decode(&response); err != nil {
            results <- err
            return
        }
        status := response.Data.Attributes.CompleteStatus
        if status == "COMPLETED" {
            results <- nil
            return
        }
        if status == "ERROR" {
            results <- ErrFailedJob
            return
        }

到目前为止,它的工作方式相当稳定,但如果我了解代码如何正常工作,可能会有一个问题。

这个常量tickerWaitTimeSeconds 当前设置为 2 秒。选择该值的方式使得请求有足够的时间成功(甚至不到 1 秒,更不用说 2 秒了),并且我们不会向 API 发送垃圾邮件。

但是,我怀疑,如果由于某种原因请求花费的时间超过 tickerWaitTimeSeconds,那么对 API 的 GET 请求可能会超出必要。

我的怀疑在这种情况下有效吗?可能是我对真正发生的事情的理解有问题,Get 调用会阻止代码,但我怀疑是这种情况。

【问题讨论】:

    标签: api go concurrency polling


    【解决方案1】:

    基于股票代码:

    自动收报机将调整时间间隔或丢弃滴答声以弥补慢速接收者。

    因此,如果Get 花费的时间比滴答间隔长,则自动收报机应该放弃滴答。 Get 调用不在单独的 goroutine 中运行,因此您不能在任何给定时间提交多个请求。如果一个 Get 持续 3 秒,那么下一个 Get 可能会在第一个之后 1 秒发生。如果您想在上一次调用完成后至少 2 秒调用 API,请在每次迭代时重置代码。

    【讨论】:

    • 我刚刚阅读了文档的那部分内容。谢谢!您能否详细说明“调整时间间隔或滴答声”是什么意思?这个“或”,特别是
    • 看看:cs.opensource.google/go/go/+/refs/tags/go1.17.6:src/time/… 容量为 1 的通道,如果通道已满(即未读取上一个刻度),计时器可以丢弃下一个刻度。
    【解决方案2】:

    为什么需要股票行情?使用time.Sleep()不是更方便吗?

    类似这样的:

    import (
        "fmt"
        "time"
    )
    
    func ticktock( d time.Duration ) {
    
        for true {
            doSomethingUseful()
            time.Sleep(d)
        }
    }
    

    https://go.dev/play/p/xtg6bqNdwuk查看它的实际应用

    您可能想要跟踪doSomethingUseful() 所需的已用时间并将其从睡眠间隔中扣除,因此您的睡眠时间永远不会超过指定的持续时间,但您可能会睡得更少。

    【讨论】:

    • 一个ticker避免了任何时间计算,例如轮询需要150ms,下一个tick将在850ms内隐式触发。
    猜你喜欢
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 2018-12-05
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    相关资源
    最近更新 更多