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

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

如何實(shí)現(xiàn)帶有在第一個(gè)循環(huán)中立即運(yùn)行的定時(shí)器的for循環(huán)機(jī)制?

如何實(shí)現(xiàn)帶有在第一個(gè)循環(huán)中立即運(yùn)行的定時(shí)器的for循環(huán)機(jī)制?

Go
翻過高山走不出你 2022-12-19 17:51:09
我想編寫一個(gè) golang 程序,在 kubernetes 的容器中作為服務(wù)運(yùn)行。該程序應(yīng)該一直運(yùn)行而不是自行終止——除非出現(xiàn)錯(cuò)誤。如果 SIGTERM 來自 kubelet / kubernetes 因?yàn)?pod 應(yīng)該被刪除,程序應(yīng)該退出。在我的第一種方法中,我實(shí)現(xiàn)了一個(gè)應(yīng)該每分鐘運(yùn)行一次的 for 循環(huán)。在這個(gè)循環(huán)中,程序從另一個(gè)服務(wù)中查詢資源并對其進(jìn)行處理。然后服務(wù)應(yīng)該“休眠”一分鐘,然后再次執(zhí)行這些步驟。在“睡眠”階段,如果有 SIGTERM,程序應(yīng)該立即響應(yīng)。func main() {    c := make(chan os.Signal, 1)  signal.Notify(c, os.Interrupt, syscall.SIGTERM)  //restart loop every minute   ticker := time.NewTicker(60 * time.Second)  defer ticker.Stop()  // while true loop  for {    select {    case <-c:      fmt.Println("Break the loop")      return    case <-ticker.C:      fmt.Println("Hello in a loop")    }  }}我目前的方法有兩個(gè)問題。首先,我第一次運(yùn)行 for 循環(huán)時(shí)必須等待一分鐘。我可以以某種方式配置它,以便計(jì)時(shí)器僅在第一次運(yùn)行后運(yùn)行嗎?第二個(gè)問題是程序不應(yīng)該在運(yùn)行之間做任何事情——除了對 SIGTERM 做出反應(yīng)。我不確定我解決問題的方法是否正確。我剛剛開始使用 GO 語言。也許有更好的方法來解決我的問題。
查看完整描述

1 回答

?
桃花長相依

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

您可以在select聲明之外完成您的工作,然后在票據(jù)通道案例中繼續(xù)。這將立即執(zhí)行您的工作一次,然后每次自動(dòng)收報(bào)機(jī)滴答作響。


您的函數(shù)看起來不錯(cuò),但最好盡可能使用上下文。


許多包(數(shù)據(jù)庫、IO 等)都可以選擇指定上下文,這通常用于定義超時(shí)。在您的情況下,將相同(或子)上下文傳遞給這些包將意味著它們也尊重 sigterm。


package main


import (

    "context"

    "fmt"

    "os"

    "os/signal"

    "syscall"

    "time"

)


func main() {

    ctx := cancelCtxOnSigterm(context.Background())

    startWork(ctx)

}


// cancelCtxOnSigterm returns a Context that will be cancelled when the program receives a sigterm.

func cancelCtxOnSigterm(ctx context.Context) context.Context {

    exitCh := make(chan os.Signal, 1)

    signal.Notify(exitCh, os.Interrupt, syscall.SIGTERM)


    ctx, cancel := context.WithCancel(ctx)

    go func() {

        <-exitCh

        cancel()

    }()

    return ctx

}


// startWork performs a task every 60 seconds until the context is done.

func startWork(ctx context.Context) {

    ticker := time.NewTicker(60 * time.Second)

    defer ticker.Stop()

    for {

        // Do work here so we don't need duplicate calls. It will run immediately, and again every minute as the loop continues.

        if err := work(ctx); err != nil {

            fmt.Printf("failed to do work: %s", err)

        }

        select {

        case <-ticker.C:

            continue

        case <-ctx.Done():

            return

        }

    }

}


func work(ctx context.Context) error {

    fmt.Println("doing work")

    return nil

}


查看完整回答
反對 回復(fù) 2022-12-19
  • 1 回答
  • 0 關(guān)注
  • 131 瀏覽

添加回答

舉報(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)