最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go實(shí)現(xiàn)一個輕量級并發(fā)任務(wù)調(diào)度器(支持限速)

 更新時間:2025年04月22日 10:42:00   作者:程序員愛釣魚  
本文主要介紹了Go實(shí)現(xiàn)一個輕量級并發(fā)任務(wù)調(diào)度器(支持限速),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

在日常開發(fā)中,我們經(jīng)常會遇到這樣的場景:

  • 有一堆任務(wù)要跑(比如:發(fā)請求、處理數(shù)據(jù)、爬蟲等)
  • 不希望一次性全部跑完,擔(dān)心打爆服務(wù)端或者被封
  • 想要設(shè)置并發(fā)數(shù)、限速,還能控制任務(wù)重試、失敗記錄

那么,能不能用 Go 實(shí)現(xiàn)一個“輕量級的并發(fā)任務(wù)調(diào)度器”?——答案是:當(dāng)然可以!

今天我們就來用 Go 從零實(shí)現(xiàn)一個可配置的任務(wù)調(diào)度器,支持:

  • 最大并發(fā)數(shù)控制(worker pool)
  • 每秒請求速率限制(rate limit)
  • 簡單的失敗重試機(jī)制
  • 支持結(jié)果收集與錯誤輸出

效果展示

你可以像這樣調(diào)用我們的調(diào)度器:

scheduler := NewScheduler(5, 10) // 并發(fā) 5,速率限制每秒 10 次

for i := 0; i < 100; i++ {
    task := NewTask(func() error {
        // 模擬網(wǎng)絡(luò)請求或業(yè)務(wù)邏輯
        fmt.Println("正在處理任務(wù):", i)
        time.Sleep(300 * time.Millisecond)
        return nil
    })
    scheduler.Submit(task)
}

scheduler.Wait()
fmt.Println("全部任務(wù)完成")

核心組件設(shè)計

1. 任務(wù)(Task)

我們將每個任務(wù)抽象為一個結(jié)構(gòu)體:

type Task struct {
    fn   func() error
    retry int
}

2. 調(diào)度器(Scheduler)

負(fù)責(zé)維護(hù)任務(wù)隊(duì)列、worker、速率限制器:

type Scheduler struct {
    tasks       chan *Task
    wg          sync.WaitGroup
    rateLimiter &lt;-chan time.Time
}

實(shí)現(xiàn)代碼

下面是完整實(shí)現(xiàn)(可以直接復(fù)制使用):

type Task struct {
    fn    func() error
    retry int
}

func NewTask(fn func() error) *Task {
    return &Task{fn: fn, retry: 3}
}

type Scheduler struct {
    tasks       chan *Task
    wg          sync.WaitGroup
    rateLimiter <-chan time.Time
}

func NewScheduler(concurrency int, ratePerSecond int) *Scheduler {
    s := &Scheduler{
        tasks:       make(chan *Task, 100),
        rateLimiter: time.Tick(time.Second / time.Duration(ratePerSecond)),
    }

    for i := 0; i < concurrency; i++ {
        go s.worker()
    }

    return s
}

func (s *Scheduler) Submit(task *Task) {
    s.wg.Add(1)
    s.tasks <- task
}

func (s *Scheduler) worker() {
    for task := range s.tasks {
        <-s.rateLimiter // 限速

        err := task.fn()
        if err != nil && task.retry > 0 {
            fmt.Println("任務(wù)失敗,重試中...")
            task.retry--
            s.Submit(task)
        } else if err != nil {
            fmt.Println("任務(wù)最終失敗:", err)
        }

        s.wg.Done()
    }
}

func (s *Scheduler) Wait() {
    s.wg.Wait()
    close(s.tasks)
}

實(shí)戰(zhàn)應(yīng)用場景

  • 網(wǎng)絡(luò)爬蟲限速抓取
  • 批量發(fā)送郵件/SMS/請求,防止接口限流
  • 云服務(wù)任務(wù)調(diào)度、批量自動化操作
  • 異步數(shù)據(jù)采集和聚合

總結(jié)

Go 的并發(fā)模型非常適合處理“海量任務(wù) + 控制速率 + 錯誤重試”的需求。本篇實(shí)現(xiàn)的調(diào)度器非常輕量,適合作為基礎(chǔ)組件集成到你自己的系統(tǒng)中。

如果你有更多需求,比如:

  • 增加失敗回調(diào)
  • 支持超時控制
  • 任務(wù)優(yōu)先級
  • 后臺監(jiān)控 dashboard

到此這篇關(guān)于Go實(shí)現(xiàn)一個輕量級并發(fā)任務(wù)調(diào)度器(支持限速)的文章就介紹到這了,更多相關(guān)Go 并發(fā)任務(wù)調(diào)度器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • go如何終止多個for select循環(huán)嵌套的方法

    go如何終止多個for select循環(huán)嵌套的方法

    當(dāng)您想從嵌套循環(huán)中中斷,從select內(nèi)部終止循環(huán)時,標(biāo)記的中斷非常有用,本文主要介紹了go如何終止多個for select循環(huán)嵌套的方法,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • go語言制作分頁器實(shí)例探究

    go語言制作分頁器實(shí)例探究

    這篇文章主要為大家介紹了go語言制作分頁器實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Go語言實(shí)戰(zhàn)學(xué)習(xí)之流程控制詳解

    Go語言實(shí)戰(zhàn)學(xué)習(xí)之流程控制詳解

    這篇文章主要為大家詳細(xì)介紹了Go語言中的流程控制,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定的幫助?,需要的朋友可以參考下
    2022-08-08
  • golang通過context控制并發(fā)的應(yīng)用場景實(shí)現(xiàn)

    golang通過context控制并發(fā)的應(yīng)用場景實(shí)現(xiàn)

    這篇文章主要介紹了golang通過context控制并發(fā)的應(yīng)用場景實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Go中g(shù)in框架的*gin.Context參數(shù)常見實(shí)用方法

    Go中g(shù)in框架的*gin.Context參數(shù)常見實(shí)用方法

    *gin.Context是處理HTTP請求的核心,ctx代表"context"(上下文),它包含了處理請求所需的所有信息和方法,例如請求數(shù)據(jù)、響應(yīng)構(gòu)建器、路由參數(shù)等,這篇文章主要介紹了Go中g(shù)in框架的*gin.Context參數(shù)常見實(shí)用方法,需要的朋友可以參考下
    2024-07-07
  • Mac下Vs code配置Go語言環(huán)境的詳細(xì)過程

    Mac下Vs code配置Go語言環(huán)境的詳細(xì)過程

    這篇文章給大家介紹Mac下Vs code配置Go語言環(huán)境的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-07-07
  • Go并發(fā)編程實(shí)現(xiàn)數(shù)據(jù)競爭

    Go并發(fā)編程實(shí)現(xiàn)數(shù)據(jù)競爭

    本文主要介紹了Go并發(fā)編程實(shí)現(xiàn)數(shù)據(jù)競爭,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Go使用path/filepath包處理文件路徑的完全指南

    Go使用path/filepath包處理文件路徑的完全指南

    本文詳細(xì)介紹了Go語言中path/filepath包的使用,涵蓋了路徑處理、拼接、規(guī)范化、遍歷和匹配等功能,適用于文件系統(tǒng)操作的各種場景,需要的朋友可以參考下
    2026-03-03
  • Go語言利用heap實(shí)現(xiàn)優(yōu)先級隊(duì)列

    Go語言利用heap實(shí)現(xiàn)優(yōu)先級隊(duì)列

    這篇文章主要為大家詳細(xì)介紹了Go語言中heap的使用以及如何利用heap實(shí)現(xiàn)優(yōu)先級隊(duì)列的相關(guān)資料,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • 在Golang中實(shí)現(xiàn)定時任務(wù)的幾種高效方法

    在Golang中實(shí)現(xiàn)定時任務(wù)的幾種高效方法

    本文將詳細(xì)介紹在Golang中實(shí)現(xiàn)定時任務(wù)的幾種高效方法,包括time包中的Ticker和Timer、第三方庫cron的使用,以及基于channel和goroutine的自定義實(shí)現(xiàn),我們將通過實(shí)際代碼示例和性能分析,幫助開發(fā)者選擇最適合自己場景的定時任務(wù)解決方案,需要的朋友可以參考下
    2025-06-06

最新評論

南宫市| 平定县| 专栏| 玛纳斯县| 武汉市| 寿阳县| 滕州市| 工布江达县| 兰西县| 蒙阴县| 越西县| 伊吾县| 长治县| 济宁市| 富蕴县| 友谊县| 山阴县| 阿克陶县| 威宁| 古浪县| 丁青县| 基隆市| 保山市| 思南县| 武陟县| 葫芦岛市| 兰坪| 永平县| 临沭县| 大化| 信宜市| 永吉县| 丰宁| 简阳市| 新野县| 高邑县| 宜城市| 临海市| 彰化县| 宜丰县| 闻喜县|