💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 使用场景 Ticker是周期性定时器,即周期性的触发一个事件,通过Ticker本身提供的管道将事件传递出去 ### 简单定时任务 有时,我们希望定时执行一个任务,这时就可以使用ticker来完成。 下面代码演示,每隔1s记录一次日志: ~~~go // TickerDemo 用于演示ticker基础用法 func TickerDemo() { ticker := time.NewTicker(1 * time.Second) defer ticker.Stop() for range ticker.C { log.Println("Ticker tick.") } } ~~~ 上述代码中,`for range ticker.C`会持续从管道中获取事件,收到事件后打印一行日志,如果管道中没有数据会阻塞等待事件,由于ticker会周期性的向管道中写入事件,所以上述程序会周期性的打印日志 另一种实现方法: ~~~ func TestTicker2(t *testing.T) { channel := time.Tick(1 * time.Second) for{ select { case <- channel: t.Log("running:", time.Now()) } } } ~~~ ### 定时聚合任务 有时,我们希望把一些任务打包进行批量处理。比如,公交车发车场景: * 公交车每隔5分钟发一班,不管是否已坐满乘客; * 已坐满乘客情况下,不足5分钟也发车; 下面代码演示公交车发车场景: ~~~go // TickerLaunch用于演示ticker聚合任务用法 func TickerLaunch() { ticker := time.NewTicker(5 * time.Minute) maxPassenger := 30 // 每车最大装载人数 passengers := make([]string, 0, maxPassenger) for { passenger := GetNewPassenger() // 获取一个新乘客 if passenger != "" { passengers = append(passengers, passenger) } else { time.Sleep(1 * time.Second) } select { case <- ticker.C: // 时间到,发车 Launch(passengers) passengers = []string{} default: if len(passengers) >= maxPassenger { // 时间没到,车已座满,发车 Launch(passengers) passengers = []string{} } } } } ~~~ 上面代码中for循环负责接待乘客上车,并决定是否要发车。每当乘客上车,select语句会先判断ticker.C中是否有数据,有数据则代表发车时间已到,如果没有数据,则判断车是否已坐满,坐满后仍然发车