Golang Timer
我们trm里面有个kube-system项目,由于是k8s的内置namespace,所以创建的时间比较早,在当时的情况下没有办法在cfe创建icagent的守护进程,所以以前没有默认开启平台监控这个功能。
然后有同事反应必须要开启,不然就不能做到日志转储,导致磁盘空间占满,于是我想到了一个办法,之所以没办法开启,是因为当时的条件创不出来,但是等到环境安装到一定进度后,有条件了就可以创建出来了。可以设计一个定时器,在创建这个项目的时候就开始创这个icagent ,每隔20秒创建一次,直到创建成功。
定时器设计如下:
func CreateProject() {
PresetProject() //创建kube-system
go func() {
isSucceed := false //设置标志位
logger.info("start try to create icagent daemonset")
for !isSucceed {
err := createIcagent()
if err == nil {
isSucceed = true
logger.info("create icagent daemonset succeed")
}
time.Sleep(20 * time.Second)
}
}()
return
}
一个很简单的定时器,用isSucceed作为标志位,如果是失败的就一直循环创建,一旦成功,就退出了这个goroutine。
除此之外,还可以使用以下两种方法来实现一个定时器:
func main() {
timer := time.NewTimer(time.Second)
fmt.Println(<-timer.C) //timer.Reset重置 timer.Stop 停止
}
fmt.Println(<-time.After(time.Second))
两种方法都是通过对channel的释放来达到定时的效果