go语言开发基础42 - 之go语言里的定时器使用

go语言里的time包里有两个方法实现了定时器和一次性定时器,具体看下面例子:

 

一、间隔指定时长重复执行定时器示例

package main

import (
    "fmt"
    "time"
    "runtime"
)

// 定时器一:间隔指定时间执行一次(定时器就是通过channel实现的)
func main() {
    t := time.NewTicker(time.Second*3)     // 间隔:{time.NewTicker(这里设置的时长)} 执行一次
    for v := range t.C {        // t.C是一个channel Time类型的管道,每隔设置的时长就会有一个线程往管道里写入时间类型的数据
        fmt.Println("hello ",v)
    }
    t.Stop()    // 关闭定时器,防止内存泄漏(如果定时器不关闭会造成内存泄漏)
}

// 执行结果为:
hello  2020-08-05 18:02:09.1644539 +0800 CST m=+3.004128801
hello  2020-08-05 18:02:12.1652237 +0800 CST m=+6.004879001
hello  2020-08-05 18:02:15.1649615 +0800 CST m=+9.004597201

 

二、一次性定时器示例

一次性定时器(After性能不好,官方不推荐使用,还容易造成内存泄漏)
package main

import (
    "fmt"
    "time"
    "runtime"
)

func main() {
    num := runtime.NumCPU()      // 获取cpu数量
    runtime.GOMAXPROCS(num - 1)   // 绑定cpu总数量-1个的cpu上跑
    select {
    case <- time.After(time.Second*5):     // 没有关闭定时器,可能造成内存泄漏
        fmt.Println("after")
    }
}

 

posted @ 2020-08-05 18:26  欧-阳  阅读(154)  评论(0)    收藏  举报