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

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

Go 是如何按時(shí)間間隔調(diào)用 Ticker 的?

Go 是如何按時(shí)間間隔調(diào)用 Ticker 的?

Go
繁華開滿天機(jī) 2023-03-07 14:02:16
由于我不是經(jīng)驗(yàn)豐富的 Go 開發(fā)人員,所以我不了解使用 Ticker 的方式。我有以下情況:一個(gè)在特定端口 8080 上運(yùn)行的 go web 服務(wù),它從另一個(gè)應(yīng)用程序獲取數(shù)據(jù)并處理數(shù)據(jù)。到目前為止一切順利,但我在此 Web 服務(wù)中有另一個(gè)sendData功能,它循環(huán)遍歷一些文件并將它們發(fā)送到另一個(gè)外部服務(wù)。我試圖sendData()每 1 分鐘調(diào)用一次該函數(shù)。下面是沒有 Tickers 時(shí) main 函數(shù)的樣子:func main() {    http.HandleFunc("/data", headers)          //line 1    log.Printf("Ready for data ...%s\n", 8080) //line 2    http.ListenAndServe(":8080", nil)          //line 3}line 2如果我在無(wú)限循環(huán)后添加 Ticker 。如果我在之后添加line 3,程序不會(huì)調(diào)用 Ticker。知道如何處理這個(gè)嗎?代碼部分ticker := schedule(sendData, time.Second, done)time.Sleep(60 * time.Second)close(done)ticker.Stop()和時(shí)間表從func schedule(f func(), interval time.Duration, done <-chan bool) *time.Ticker {    ticker := time.NewTicker(interval)    go func() {        for {            select {            case <-ticker.C:                f()            case <-done:                return            }        }    }()    return ticker所以基本上我想在每分鐘或每小時(shí)等時(shí)發(fā)送數(shù)據(jù)。有人可以解釋 Ticker 的內(nèi)部工作原理嗎?
查看完整描述

2 回答

?
慕碼人8056858

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

http.ListenAndServe(":8080", nil)運(yùn)行一個(gè)無(wú)限for循環(huán)監(jiān)聽入站連接,這就是為什么如果你之后調(diào)用它,代碼不會(huì)被調(diào)用的原因。


然后在這里


ticker := schedule(sendData, time.Second, done)

time.Sleep(60 * time.Second)

close(done)

ticker.Stop()

您將在 60 秒后退出內(nèi)部循環(huán)schedule(),因此您的自動(dòng)收?qǐng)?bào)機(jī)將只運(yùn)行一次或根本不會(huì)運(yùn)行(取決于完成通道是在自動(dòng)收?qǐng)?bào)機(jī)運(yùn)行之前還是之后收到值,因?yàn)樗鼈兪遣l(fā)的,我們無(wú)法確定他們的訂單)


所以你想要的是以下內(nèi)容


func main() {

    http.HandleFunc("/data", headers)


    ticker := time.NewTicker(time.Minute)

    go schedule(ticker)


    log.Printf("Ready for data ...%s\n", 8080)

    http.ListenAndServe(":8080", nil)

}


func schedule(ticker *time.Ticker) {

    for {

        // This blocks until a value is received, the ticker

        // sends a value to it every one minute (or the interval specified)

        <-ticker.C

        fmt.Println("Tick")

    }

}

您可能已經(jīng)注意到,一旦服務(wù)器連接中斷,程序就會(huì)終止,因此沒有必要使用通道done來(lái)退出循環(huán)。


查看完整回答
反對(duì) 回復(fù) 2023-03-07
?
梵蒂岡之花

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

您走在正確的軌道上——您只需要將代碼聲明包裝在一個(gè)自執(zhí)行函數(shù)中,然后將其作為 goroutine 運(yùn)行。ListenAndServe并且Schedule都是阻塞任務(wù),因此它們需要在單獨(dú)的 go 例程上運(yùn)行。幸運(yùn)的是,go 使這很容易實(shí)現(xiàn)。


注意 - 此示例代碼旨在盡可能接近您的示例。我建議將代碼的聲明與計(jì)劃函數(shù)分開。


func main() {


    http.HandleFunc("/data", func(w http.ResponseWriter, req *http.Request) {}) //line 1


    var done chan bool


    go func() {

        ticker := schedule(func() { fmt.Println("Tick") }, time.Second, done)

        time.Sleep(60 * time.Second)

        close(done)

        ticker.Stop()

    }()


    fmt.Printf("Ready for data ...%v\n", 8080) //line 2

    http.ListenAndServe(":8080", nil)          //line 3

}


查看完整回答
反對(duì) 回復(fù) 2023-03-07
  • 2 回答
  • 0 關(guān)注
  • 98 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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