美文网首页Golang我的专题Go知识库
Golang周期任务、定时任务

Golang周期任务、定时任务

作者: 想入飞飞___ | 来源:发表于2018-04-09 20:10 被阅读81次

0.周期任务

5秒钟后执行一个任务ticker.C是一个缓冲为1的channel,

ticker:=time.NewTicker(time.Second*5)
    go func() {
        for _=range ticker.C {
            println("test")
        }
    }()

time.Sleep(time.Minute)

1.倒计时

//主线程阻塞

timer1:=time.NewTimer(time.Second*5)
<-timer1.C
println("test")
//主线程不阻塞
    timer2 := time.NewTimer(time.Second)

    go func() {

        //等触发时的信号

        <-timer2.C

        fmt.Println("Timer 2 expired")

    }()

    //由于上面的等待信号是在新线程中,所以代码会继续往下执行,停掉计时器

    time.Sleep(time.Second*5)

2.高级倒计时

//golang 定时器,启动的时候执行一次,以后每天晚上12点执行
func startTimer(f func()) {
        go func() {
            for {
                f()
                now := time.Now()
                // 计算下一个零点
                next := now.Add(time.Hour * 24)
                next = time.Date(next.Year(), next.Month(), next.Day(), 0, 0, 0, 0, next.Location())
                t := time.NewTimer(next.Sub(now))
                <-t.C
            }
        }()
    }

相关文章

网友评论

  • 泡泡兵团长:第三种,如果启动的时候不执行,得到具体的时间执行可以采用下面的方法

    func StartTimer(f func(), hour int, minutes int) {
    fmt.Println("task head")
    next:=time.Now()
    go func() {
    for {
    //f()
    now := time.Now()
    // 计算下一个零点
    next = time.Date(next.Year(), next.Month(), next.Day(), hour, minutes, 0, 0, next.Location())
    t := time.NewTimer(next.Sub(now))
    <-t.C
    f()
    next = now.Add(time.Hour *24 )
    }
    }()
    }
  • 0021f410a565:第二种计时器会导致内存泄漏 每次循环都新建了一个计时器 用完后并没有销毁
    0021f410a565:@孤单的不同世界 改个时间死的就很快了
    472f2cc6faa3:@lgq12172009 每天晚上12点一次,怕是这个泄漏要等几年

本文标题:Golang周期任务、定时任务

本文链接:https://www.haomeiwen.com/subject/ppjgwxtx.html