Golang中国
package main

import (
    "log"
    "time"
)

var count int

func main() {

    ticker := time.NewTicker(time.Second * 1)
    for _ = range ticker.C {
        count++
        log.Println(count, " ticker")
        work_long()

    }
}
func work_long() {
    time.Sleep(time.Second * 5)
    count++
    log.Println(count, " work_long")
}

这样每隔5秒执行一次, 而不是ticker设定的1秒执行一次. 如果ticker执行内容改为go work_long() . 这时候开始变为先执行5次ticker, 然后每1秒执行一次work_long(). 这是为什么呢?

3 回复
UlricQin
#1 UlricQin • 2015-07-16 09:11

ticker就是这么设计的。使用go work_long()的话 go work_long() 这句话就瞬间执行完成了,不会阻塞ticker了,如果ticker内的逻辑执行时间长就往后阻塞。

kulle
#2 kulle • 2015-07-25 09:06

明白, 为了不影响ticker的固定间隔, ticker触发的代码都应该独立开一个goroutine来执行.

snake117
#3 snake117 • 2015-07-25 14:07

一般的策略是,每隔固定时间尝试发送信号,如果不能发送将会阻塞,然后等待信号发送后再次计时。

另一种常用的策略是,每隔固定时间尝试发送信号,如果不能发送将放弃本次发送并重新计时。

ticker的策略是这样的,每隔固定时间尝试发送信号,ticker的通道有一个容量,所以信号首先存入容量内,如果不能发送(即容量内已有一个未发送的信号了),则更新容量内的信号,重新计时。

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。