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

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

如何獲得 time.Tick 立即打勾

如何獲得 time.Tick 立即打勾

Go
函數式編程 2021-11-08 16:56:58
我有一個循環,直到工作啟動并運行:ticker := time.NewTicker(time.Second * 2)defer ticker.Stop()started := time.Now()for now := range ticker.C {    job, err := client.Job(jobID)    switch err.(type) {    case DoesNotExistError:        continue    case InternalError:        return err    }    if job.State == "running" {        break    }    if now.Sub(started) > time.Minute*2 {        return fmt.Errorf("timed out waiting for job")    }}在生產中效果很好。唯一的問題是它使我的測試變慢。他們都至少等待 2 秒鐘才能完成。有沒有time.Tick辦法立即打勾?
查看完整描述

3 回答

?
UYOU

TA貢獻1878條經驗 獲得超4個贊

不幸的是,Go 開發人員似乎不會在任何可預見的未來添加這樣的功能,所以我們必須應對......


有兩種常用的代碼使用方法:


for 環形

鑒于這樣的事情:


ticker := time.NewTicker(period)

defer ticker.Stop()

for <- ticker.C {

    ...

}

用:


ticker := time.NewTicker(period)

defer ticker.Stop()

for ; true; <- ticker.C {

    ...

}

for-select循環

鑒于這樣的事情:


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

signal.Notify(interrupt, os.Interrupt)


ticker := time.NewTicker(period)

defer ticker.Stop()


loop:

for {

    select {

        case <- ticker.C: 

            f()

        case <- interrupt:

            break loop

    }

}

用:


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

signal.Notify(interrupt, os.Interrupt)


ticker := time.NewTicker(period)

defer ticker.Stop()


loop:

for {

    f()


    select {

        case <- ticker.C: 

            continue

        case <- interrupt:

            break loop

    }

}

為什么不直接使用time.Tick()?

盡管 Tick 對于不需要關閉 Ticker 的客戶端很有用,但請注意,如果無法關閉它,則垃圾收集器無法恢復底層的 Ticker;它“泄漏”。


https://golang.org/pkg/time/#Tick


查看完整回答
反對 回復 2021-11-08
?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

ticker := time.NewTicker(period)

for ; true; <-ticker.C {

    ...

}

https://github.com/golang/go/issues/17601




查看完整回答
反對 回復 2021-11-08
?
慕村225694

TA貢獻1880條經驗 獲得超4個贊

Ticker內部的實際實現是相當復雜的。但是你可以用一個 goroutine 包裝它:


func NewTicker(delay, repeat time.Duration) *time.Ticker {

    ticker := time.NewTicker(repeat)

    oc := ticker.C

    nc := make(chan time.Time, 1)

    go func() {

        nc <- time.Now()

        for tm := range oc {

            nc <- tm

        }

    }()

    ticker.C = nc

    return ticker

}


查看完整回答
反對 回復 2021-11-08
  • 3 回答
  • 0 關注
  • 189 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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