我有一个迭代循环,直到作业启动并运行:
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
立即勾选?
不幸的是,它seems https://github.com/golang/go/issues/17601Go 开发者在任何可预见的未来都不会添加此类功能,所以我们必须应对......
使用代码有两种常见方法:
for
loop
鉴于这样的事情:
ticker := time.NewTicker(period)
defer ticker.Stop()
for <- ticker.C {
...
}
Use:
ticker := time.NewTicker(period)
defer ticker.Stop()
for ; true; <- ticker.C {
...
}
for
-select
loop
鉴于这样的事情:
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
}
}
Use:
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 https://golang.org/pkg/time/#Tick
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)