第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何輪詢 HTTP 終結(jié)點(diǎn)并更新數(shù)據(jù)源?

如何輪詢 HTTP 終結(jié)點(diǎn)并更新數(shù)據(jù)源?

Go
慕田峪7331174 2022-08-01 18:52:01
我正在嘗試執(zhí)行一些需要較長(zhǎng)時(shí)間的CRUD操作。我想出了示例游樂場(chǎng)來演示我的問題: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)}這是一個(gè) http 請(qǐng)求在請(qǐng)求結(jié)束時(shí),我確實(shí)返回了202 http,然后觸發(fā)了一個(gè)go例程。go例程的目的,檢查所請(qǐng)求的實(shí)體是否被創(chuàng)建/刪除/更新/失敗in progress演示程序一直運(yùn)行,直到它獲得隨機(jī)數(shù)11,即類似于獲得第3點(diǎn)中的所需狀態(tài)之一。我覺得隨機(jī)數(shù)有可能在很長(zhǎng)一段時(shí)間內(nèi)永遠(yuǎn)不會(huì)達(dá)到11。(如果范圍是 100 萬)因此,我想在10次func調(diào)用后取消股票代碼。我該怎么做?是否正確使用的東西,即.請(qǐng)建議。ticker, goroutine不幸的是,在參考了幾個(gè)論壇,帖子后,我無法解碼。困惑更多與和所有。context, timer
查看完整描述

1 回答

?
慕雪6442864

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊

為了限制嘗試次數(shù),我們只需要計(jì)算所做的嘗試,這對(duì)于現(xiàn)有的for循環(huán)來說是微不足道的。


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


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


使用這些信息,我們可以想出這個(gè)修改后的例子: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()


查看完整回答
反對(duì) 回復(fù) 2022-08-01
  • 1 回答
  • 0 關(guān)注
  • 125 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)