Go实现一个轻量级并发任务调度器(支持限速)

 更新时间:2025年04月22日 10:42:00   作者:程序员爱钓鱼  
本文主要介绍了Go实现一个轻量级并发任务调度器(支持限速),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

在日常开发中,我们经常会遇到这样的场景:

  • 有一堆任务要跑(比如:发请求、处理数据、爬虫等)
  • 不希望一次性全部跑完,担心打爆服务端或者被封
  • 想要设置并发数、限速,还能控制任务重试、失败记录

那么,能不能用 Go 实现一个“轻量级的并发任务调度器”?——答案是:当然可以!

今天我们就来用 Go 从零实现一个可配置的任务调度器,支持:

  • 最大并发数控制(worker pool)
  • 每秒请求速率限制(rate limit)
  • 简单的失败重试机制
  • 支持结果收集与错误输出

效果展示

你可以像这样调用我们的调度器:

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

for i := 0; i < 100; i++ {
    task := NewTask(func() error {
        // 模拟网络请求或业务逻辑
        fmt.Println("正在处理任务:", i)
        time.Sleep(300 * time.Millisecond)
        return nil
    })
    scheduler.Submit(task)
}

scheduler.Wait()
fmt.Println("全部任务完成")

核心组件设计

1. 任务(Task)

我们将每个任务抽象为一个结构体:

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

2. 调度器(Scheduler)

负责维护任务队列、worker、速率限制器:

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

实现代码

下面是完整实现(可以直接复制使用):

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("任务失败,重试中...")
            task.retry--
            s.Submit(task)
        } else if err != nil {
            fmt.Println("任务最终失败:", err)
        }

        s.wg.Done()
    }
}

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

实战应用场景

  • 网络爬虫限速抓取
  • 批量发送邮件/SMS/请求,防止接口限流
  • 云服务任务调度、批量自动化操作
  • 异步数据采集和聚合

总结

Go 的并发模型非常适合处理“海量任务 + 控制速率 + 错误重试”的需求。本篇实现的调度器非常轻量,适合作为基础组件集成到你自己的系统中。

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

  • 增加失败回调
  • 支持超时控制
  • 任务优先级
  • 后台监控 dashboard

到此这篇关于Go实现一个轻量级并发任务调度器(支持限速)的文章就介绍到这了,更多相关Go 并发任务调度器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • go如何终止多个for select循环嵌套的方法

    go如何终止多个for select循环嵌套的方法

    当您想从嵌套循环中中断,从select内部终止循环时,标记的中断非常有用,本文主要介绍了go如何终止多个for select循环嵌套的方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • go语言制作分页器实例探究

    go语言制作分页器实例探究

    这篇文章主要为大家介绍了go语言制作分页器实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Go语言实战学习之流程控制详解

    Go语言实战学习之流程控制详解

    这篇文章主要为大家详细介绍了Go语言中的流程控制,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助 ,需要的朋友可以参考下
    2022-08-08
  • golang通过context控制并发的应用场景实现

    golang通过context控制并发的应用场景实现

    这篇文章主要介绍了golang通过context控制并发的应用场景实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Go中gin框架的*gin.Context参数常见实用方法

    Go中gin框架的*gin.Context参数常见实用方法

    *gin.Context是处理HTTP请求的核心,ctx代表"context"(上下文),它包含了处理请求所需的所有信息和方法,例如请求数据、响应构建器、路由参数等,这篇文章主要介绍了Go中gin框架的*gin.Context参数常见实用方法,需要的朋友可以参考下
    2024-07-07
  • Mac下Vs code配置Go语言环境的详细过程

    Mac下Vs code配置Go语言环境的详细过程

    这篇文章给大家介绍Mac下Vs code配置Go语言环境的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-07-07
  • Go并发编程实现数据竞争

    Go并发编程实现数据竞争

    本文主要介绍了Go并发编程实现数据竞争,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Go使用path/filepath包处理文件路径的完全指南

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

    本文详细介绍了Go语言中path/filepath包的使用,涵盖了路径处理、拼接、规范化、遍历和匹配等功能,适用于文件系统操作的各种场景,需要的朋友可以参考下
    2026-03-03
  • Go语言利用heap实现优先级队列

    Go语言利用heap实现优先级队列

    这篇文章主要为大家详细介绍了Go语言中heap的使用以及如何利用heap实现优先级队列的相关资料,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-05-05
  • 在Golang中实现定时任务的几种高效方法

    在Golang中实现定时任务的几种高效方法

    本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和goroutine的自定义实现,我们将通过实际代码示例和性能分析,帮助开发者选择最适合自己场景的定时任务解决方案,需要的朋友可以参考下
    2025-06-06

最新评论