【发布时间】: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