为了账号安全,请及时绑定邮箱和手机立即绑定

如何获得 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 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信