欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Go語言輕松構建定時任務調度器的示例代碼

 更新時間:2025年08月07日 08:53:15   作者:程序員愛釣魚  
Go 標準庫?time?包提供了非常強大且簡潔的支持,配合協(xié)程可輕松構建定時任務調度器,下面就跟隨小編一起來了解下如何使用Go語言實現(xiàn)任務調度器可以定時執(zhí)行任務吧

在后端服務、日志采集、數(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源碼分析之golang/sync之singleflight

    golang/sync庫拓展了官方自帶的sync庫,提供了errgroup、semaphore、singleflight及syncmap四個包,本次先分析第一個包errgroup的源代碼,下面這篇文章主要給大家介紹了關于Golang源碼分析之golang/sync之singleflight的相關資料,需要的朋友可以參考下
    2022-11-11
  • golang操作mongodb的方法

    golang操作mongodb的方法

    這篇文章主要介紹了golang操作mongodb的方法,涉及Go語言操作mongodb的連接、讀取及顯示的方法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • 如何解析golang中Context在HTTP服務中的角色

    如何解析golang中Context在HTTP服務中的角色

    這篇文章主要介紹了如何解析golang中Context在HTTP服務中的角色問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • GoFrame?gredis緩存DoVar及Conn連接對象的自動序列化

    GoFrame?gredis緩存DoVar及Conn連接對象的自動序列化

    這篇文章主要為大家介紹了GoFrame?gredis干貨DoVar?Conn連接對象自動序列化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 解析golang 標準庫template的代碼生成方法

    解析golang 標準庫template的代碼生成方法

    這個項目的自動生成代碼都是基于 golang 的標準庫 template 的,所以這篇文章也算是對使用 template 庫的一次總結,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2021-11-11
  • Go?1.22版本新特性前瞻

    Go?1.22版本新特性前瞻

    這篇文章主要為大家介紹了Go?1.22版本新特性前瞻,包含語言的變化,編譯器、運行時與工具鏈等應用對比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Golang 高效排序數(shù)據(jù)詳情

    Golang 高效排序數(shù)據(jù)詳情

    本文我們介紹了怎么使用 Golang 語言標準庫 sort 包排序數(shù)據(jù),需要注意的是,除了本文使用的類型之外,其它任意類型只要實現(xiàn) sort.Interface 的三個方法,都可以調用 sort.Sort() 函數(shù)排序數(shù)據(jù)。
    2021-11-11
  • golang環(huán)形隊列實現(xiàn)代碼示例

    golang環(huán)形隊列實現(xiàn)代碼示例

    這篇文章主要介紹了golang環(huán)形隊列實現(xiàn)代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • 教你一分鐘配置好Go語言開發(fā)環(huán)境(多種操作系統(tǒng))

    教你一分鐘配置好Go語言開發(fā)環(huán)境(多種操作系統(tǒng))

    在這篇文章中,我們從頭到尾一步步指導你配置Golang開發(fā)環(huán)境,并編寫你的第一個"Hello,?World!"程序,我們詳細解釋了在多種操作系統(tǒng)(包括Windows、Linux和macOS)下的安裝過程、環(huán)境變量設置以及如何驗證安裝是否成功
    2023-09-09
  • Go語言中使用gorm小結

    Go語言中使用gorm小結

    這篇文章主要給大家介紹了Go語言中如何使用gorm,文中介紹的很詳細,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12

最新評論