Ticker配合Worker Pool是Go中优化定时任务的成熟方案:用Ticker复用goroutine替代频繁创建,再通过带缓冲channel分发任务至固定数量worker,兼顾轻量性与并发可控性。
用 Ticker 配合 Worker Pool 是 Golang 中降低定时任务开销、提升并发处理能力的成熟方案。核心在于避免每次触发都新
建 goroutine,同时控制并发数防止资源耗尽。
time.AfterFunc 每次调用都会启动新 goroutine,若任务频率高、执行快,容易堆积大量短暂 goroutine,增加调度压力。而 time.Ticker 复用一个 goroutine 持续发信号,更轻量。
推荐写法:
ticker := time.NewTicker(10 * time.Second) defer ticker.Stop()for range ticker.C { // 不在这里直接处理业务,只发任务 jobQueue <- Job{...} }
把任务分发到固定数量的工作协程中,既能复用 goroutine,又能防止单次触发引发雪崩(比如 1 秒内拉取 1000 条数据并逐条 HTTP 请求)。
关键点:
jobQueue = make(chan Job, 100)),避免 Ticker 发送阻塞for i := 0; i )
for job := range jobQueue 持续消费,不退出worker 中的单个任务若长时间阻塞(如无超时的 HTTP 调用)或 panic,会导致该 worker 卡死或退出,降低吞吐。务必做到:
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second))recover() 捕获 panic,记录错误但不中断 worker并发数、channel 缓冲大小、Ticker 间隔不是越小越好。建议:
基本上就这些。Ticker 负责“准时发令”,Worker Pool 负责“稳住节奏”,两者配合让定时任务既准时又扛压。