亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何輪詢 HTTP 終結點并更新數據源?

如何輪詢 HTTP 終結點并更新數據源?

Go
慕田峪7331174 2022-08-01 18:52:01
我正在嘗試執行一些需要較長時間的CRUD操作。我想出了示例游樂場來演示我的問題:package mainimport (    "fmt"    "math/rand"    "time")func call(s int) {    fmt.Println(s)}func get() int {    num := rand.Intn(20-10) + 5    return num}func main() {    call(1)    ticker := time.NewTicker(1000 * time.Millisecond)    stop := make(chan bool, 1)    check := make(chan string, 1)    go func() {        for {            select {            case <-stop:                check <- "done"                     fmt.Println("stopped")                return            case <-ticker.C:                randInt := get()                if randInt == 11 {                    call(randInt)                    stop <- true                } else {                    call(randInt)                }            }        }    }()        //fmt.Println(<-stop)}這是一個 http 請求在請求結束時,我確實返回了202 http,然后觸發了一個go例程。go例程的目的,檢查所請求的實體是否被創建/刪除/更新/失敗in progress演示程序一直運行,直到它獲得隨機數11,即類似于獲得第3點中的所需狀態之一。我覺得隨機數有可能在很長一段時間內永遠不會達到11。(如果范圍是 100 萬)因此,我想在10次func調用后取消股票代碼。我該怎么做?是否正確使用的東西,即.請建議。ticker, goroutine不幸的是,在參考了幾個論壇,帖子后,我無法解碼。困惑更多與和所有。context, timer
查看完整描述

1 回答

?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

為了限制嘗試次數,我們只需要計算所做的嘗試,這對于現有的for循環來說是微不足道的。


它出現在您打算使其可取消的頻道中,但此處的用法將無法按預期工作。您可以為此使用 a,稍后可以將其合并到接受上下文的其他調用中。否則,a 是等待完成的預期方法。stopcontext.Contextsync.WaitGroup


等待 goroutine 返回可以通過通道完成,但不應依賴于發送單個值。如示例中所示,多個讀取器(可能由于重構而稍后添加)將導致另一個讀取器無法接收信號。如果您確實使用頻道,則關閉頻道是廣播信號的規范方式。


使用這些信息,我們可以想出這個修改后的例子:https://play.golang.org/p/hZiRXtMm-SB


ctx, cancel := context.WithCancel(context.Background())

defer cancel()


maxAttempts := 5


var wg sync.WaitGroup

wg.Add(1)

go func() {

    defer wg.Done()

    ticker := time.NewTicker(1000 * time.Millisecond)


    call(1)


    for i := 1; ; i++ {

        if i >= maxAttempts {

            fmt.Println("too many tries")

            return

        }


        select {

        case <-ctx.Done():

            fmt.Println("cancelled")

            return


        case <-ticker.C:

            randInt := get()

            call(randInt)

            if randInt == 11 {

                fmt.Println("OK")

                return

            }

        }

    }

}()


wg.Wait()


查看完整回答
反對 回復 2022-08-01
  • 1 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號