為了檢查狀態訊息,我需要定期輪詢一個 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呼叫阻止了股票行情,但我懷疑情況是否如此。
uj5u.com熱心網友回復:
根據股票代碼:
自動收報機將調整時間間隔或丟棄滴答聲以彌補慢速接收器。
Get因此,如果花費的時間超過滴答間隔,則自動收報器應該放棄滴答聲。該Get呼叫不在單獨的 goroutine 中運行,因此您不能在任何給定時間提交多個請求。如果一個Get持續 3 秒,下一個可能Get會在第一個之后 1 秒發生。如果您想在上一次呼叫完成后至少 2 秒呼叫 API,請在每次迭代時重置代碼。
uj5u.com熱心網友回復:
為什么需要股票行情?使用起來不是更方便time.Sleep()嗎?
像這樣的東西:
import (
"fmt"
"time"
)
func ticktock( d time.Duration ) {
for true {
doSomethingUseful()
time.Sleep(d)
}
}
在https://go.dev/play/p/xtg6bqNdwuk查看它的實際應用
您可能想要跟蹤所需的經過時間doSomethingUseful()并將其從睡眠間隔中扣除,因此您的睡眠時間永遠不會超過指定的持續時間,但您可能會睡得更少。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/417938.html
標籤:
