基于Go語言輕松構建定時任務調度器的示例代碼
在后端服務、日志采集、數(shù)據(jù)清洗、健康檢查等應用中,我們經(jīng)常需要實現(xiàn)“每隔一段時間執(zhí)行某個任務”。Go 標準庫 time 包提供了非常強大且簡潔的支持,配合協(xié)程可輕松構建定時任務調度器。
一、需求背景
我們希望實現(xiàn)一個任務調度器,能夠:
- 每隔固定時間執(zhí)行某個函數(shù);
- 支持并發(fā)安全;
- 可停止調度器(支持任務終止);
- 可擴展多個任務調度。
二、實現(xiàn)方案一:使用time.Ticker
Go 的 time.Ticker 提供了周期性觸發(fā)的功能。配合 select 和 goroutine 可實現(xiàn)高效的調度器。
示例:每 2 秒執(zhí)行一次任務
package main
import (
"fmt"
"time"
)
func task() {
fmt.Println("任務執(zhí)行時間:", time.Now())
}
func main() {
ticker := time.NewTicker(2 * time.Second)
defer ticker.Stop()
done := make(chan bool)
go func() {
for {
select {
case <-done:
fmt.Println("調度器已停止")
return
case t := <-ticker.C:
fmt.Println("調度器觸發(fā):", t)
task()
}
}
}()
// 模擬運行一段時間后終止
time.Sleep(10 * time.Second)
done <- true
}
輸出示例:
調度器觸發(fā):2025-08-05 20:00:00
任務執(zhí)行時間:2025-08-05 20:00:00
調度器觸發(fā):2025-08-05 20:00:02
任務執(zhí)行時間:2025-08-05 20:00:02
...
調度器已停止
三、實現(xiàn)方案二:封裝通用任務調度器結構體
為了更靈活地管理多個任務,我們可以封裝一個 Scheduler 類型。
type TaskFunc func()
type Scheduler struct {
ticker *time.Ticker
quit chan struct{}
running bool
mu sync.Mutex
}
func NewScheduler(interval time.Duration, task TaskFunc) *Scheduler {
return &Scheduler{
ticker: time.NewTicker(interval),
quit: make(chan struct{}),
running: false,
}
}
func (s *Scheduler) Start(task TaskFunc) {
s.mu.Lock()
if s.running {
s.mu.Unlock()
return
}
s.running = true
s.mu.Unlock()
go func() {
for {
select {
case <-s.quit:
return
case <-s.ticker.C:
task()
}
}
}()
}
func (s *Scheduler) Stop() {
s.mu.Lock()
defer s.mu.Unlock()
if s.running {
close(s.quit)
s.ticker.Stop()
s.running = false
}
}
使用示例
func main() {
scheduler := NewScheduler(3*time.Second, nil)
scheduler.Start(func() {
fmt.Println("執(zhí)行任務:", time.Now())
})
time.Sleep(10 * time.Second)
scheduler.Stop()
fmt.Println("調度器停止")
}
四、任務調度器使用場景舉例
| 場景 | 調度內容 |
|---|---|
| 日志清理 | 每天凌晨清除舊日志 |
| 服務心跳 | 每 5 秒上報健康狀態(tài) |
| 數(shù)據(jù)同步 | 每小時同步遠程數(shù)據(jù) |
| 自動備份 | 每天 23:00 執(zhí)行數(shù)據(jù)備份 |
五、注意事項
1. 資源釋放:
使用 time.Ticker 時,一定要在停止時調用 ticker.Stop(),否則會泄露定時器資源。
2. 線程安全:
如果調度器涉及狀態(tài)管理(如是否運行中),需要使用 sync.Mutex 加鎖保護。
3. 協(xié)程退出機制:
使用 chan struct{} 來安全地關閉 goroutine 是一種推薦方式。
六、進階建議
可結合 context.Context 實現(xiàn)更細粒度的取消控制;
支持動態(tài)更改調度時間(重設 ticker);
結合 cron 表達式(第三方庫如 robfig/cron)實現(xiàn)更復雜的計劃任務;
支持任務失敗重試與日志記錄機制。
七、結語
通過 time.Ticker 和 goroutine,Go 可以非常優(yōu)雅地實現(xiàn)定時任務調度器。雖然標準庫方案簡單,但足以應對大多數(shù)日常應用。你可以在此基礎上封裝出強大的任務調度框架,用于后臺服務、數(shù)據(jù)處理、定時推送等業(yè)務場景。
到此這篇關于基于Go語言輕松構建定時任務調度器的示例代碼的文章就介紹到這了,更多相關Go定時任務調度器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Golang源碼分析之golang/sync之singleflight
golang/sync庫拓展了官方自帶的sync庫,提供了errgroup、semaphore、singleflight及syncmap四個包,本次先分析第一個包errgroup的源代碼,下面這篇文章主要給大家介紹了關于Golang源碼分析之golang/sync之singleflight的相關資料,需要的朋友可以參考下2022-11-11
GoFrame?gredis緩存DoVar及Conn連接對象的自動序列化
這篇文章主要為大家介紹了GoFrame?gredis干貨DoVar?Conn連接對象自動序列化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06
教你一分鐘配置好Go語言開發(fā)環(huán)境(多種操作系統(tǒng))
在這篇文章中,我們從頭到尾一步步指導你配置Golang開發(fā)環(huán)境,并編寫你的第一個"Hello,?World!"程序,我們詳細解釋了在多種操作系統(tǒng)(包括Windows、Linux和macOS)下的安裝過程、環(huán)境變量設置以及如何驗證安裝是否成功2023-09-09

