MST

星途 面试题库

面试题:Go语言中Timer与Ticker实现定时任务的区别

请阐述在Go语言里,Timer和Ticker在实现定时任务方面有哪些不同点,分别适用于怎样的应用场景,并给出简单代码示例说明。
19.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

不同点

  1. 执行次数
    • Timer:只执行一次定时任务。它设定一个时间间隔,时间一到就触发一次相应的动作。
    • Ticker:周期性地执行定时任务。按照设定的时间间隔,不断地重复触发任务。
  2. 使用场景
    • Timer:适用于需要在未来某个特定时间点执行一次的任务,比如超时控制、延迟操作等。例如,一个网络请求设置了5秒的超时时间,如果5秒内没有收到响应,则执行超时处理逻辑。
    • Ticker:适用于需要周期性执行的任务,如定时数据采集、定时备份等。比如每10分钟检查一次系统资源使用情况并记录日志。

代码示例

Timer示例

package main

import (
    "fmt"
    "time"
)

func main() {
    timer := time.NewTimer(2 * time.Second)
    fmt.Println("Start waiting...")
    <-timer.C
    fmt.Println("Timer fired")
}

在这个示例中,time.NewTimer(2 * time.Second) 创建了一个2秒后触发的Timer。<-timer.C 会阻塞当前 goroutine,直到Timer触发,然后打印 "Timer fired"。

Ticker示例

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(1 * time.Second)
    defer ticker.Stop()
    go func() {
        for {
            select {
            case <-ticker.C:
                fmt.Println("Ticker fired")
            }
        }
    }()
    time.Sleep(5 * time.Second)
}

在这个示例中,time.NewTicker(1 * time.Second) 创建了一个每秒触发一次的Ticker。在匿名goroutine中,通过 select 监听 ticker.C 通道,每次通道接收到数据时(即每1秒),打印 "Ticker fired"。time.Sleep(5 * time.Second) 用于让主goroutine等待5秒,以便观察Ticker的多次触发。defer ticker.Stop() 用于在程序结束时停止Ticker,避免资源泄漏。