我有一个循环,它会一直迭代,直到一个作业启动并运行:
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
立即滴答作响?
7条答案
按热度按时间vddsk6oq1#
不幸的是,Go语言开发者在可预见的未来不会添加这样的功能,所以我们必须科普......
有两种常用的方式使用股票代码:
for
循环假设如下:
用途:
for
-select
循环假设如下:
用途:
为什么不直接使用
time.Tick()
呢?虽然Tick对于不需要关闭Ticker的客户端很有用,但是要注意,如果没有办法关闭它,垃圾收集器就无法恢复底层的Ticker;它会“泄漏”。
https://golang.org/pkg/time/#Tick
omtl5h9j2#
https://github.com/golang/go/issues/17601
6kkfgxo03#
Ticker
的实际内部实现相当复杂,但是你可以用一个goroutine来 Package 它:7bsow1i64#
如果你想立刻检查作业,不要在for循环中使用代码作为条件。例如:
如果您确实需要检查
DoesNotExistError
,那么您需要确保在代码显示之后进行检查,这样就不会出现忙等待的情况。eit6fx6z5#
我编造了这样的故事
vqlkdk9b6#
我认为这可能是
for-select
循环的一个有趣的替代方案,特别是当case
的内容不是一个简单的函数时:具有:
用途:
ivqmmu1c7#
使用Timer代替Ticker怎么样?Timer可以从零持续时间开始,然后重置为所需的持续时间值: