基于Go语言轻松构建定时任务调度器的示例代码

 更新时间:2025年08月07日 08:53:15   作者:程序员爱钓鱼  
Go 标准库 time 包提供了非常强大且简洁的支持,配合协程可轻松构建定时任务调度器,下面就跟随小编一起来了解下如何使用Go语言实现任务调度器可以定时执行任务吧

在后端服务、日志采集、数据清洗、健康检查等应用中,我们经常需要实现“每隔一段时间执行某个任务”。Go 标准库 time 包提供了非常强大且简洁的支持,配合协程可轻松构建定时任务调度器。

一、需求背景

我们希望实现一个任务调度器,能够:

  • 每隔固定时间执行某个函数;
  • 支持并发安全;
  • 可停止调度器(支持任务终止);
  • 可扩展多个任务调度。

二、实现方案一:使用time.Ticker

Go 的 time.Ticker 提供了周期性触发的功能。配合 select 和 goroutine 可实现高效的调度器。

示例:每 2 秒执行一次任务

package main

import (
    "fmt"
    "time"
)

func task() {
    fmt.Println("任务执行时间:", 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("调度器触发:", t)
                task()
            }
        }
    }()

    // 模拟运行一段时间后终止
    time.Sleep(10 * time.Second)
    done <- true
}

输出示例:

调度器触发:2025-08-05 20:00:00
任务执行时间:2025-08-05 20:00:00
调度器触发:2025-08-05 20:00:02
任务执行时间:2025-08-05 20:00:02
...
调度器已停止

三、实现方案二:封装通用任务调度器结构体

为了更灵活地管理多个任务,我们可以封装一个 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("执行任务:", time.Now())
    })

    time.Sleep(10 * time.Second)
    scheduler.Stop()
    fmt.Println("调度器停止")
}

四、任务调度器使用场景举例

场景调度内容
日志清理每天凌晨清除旧日志
服务心跳每 5 秒上报健康状态
数据同步每小时同步远程数据
自动备份每天 23:00 执行数据备份

五、注意事项

1. 资源释放

使用 time.Ticker 时,一定要在停止时调用 ticker.Stop(),否则会泄露定时器资源。

2. 线程安全

如果调度器涉及状态管理(如是否运行中),需要使用 sync.Mutex 加锁保护。

3. 协程退出机制

使用 chan struct{} 来安全地关闭 goroutine 是一种推荐方式。

六、进阶建议

可结合 context.Context 实现更细粒度的取消控制;

支持动态更改调度时间(重设 ticker);

结合 cron 表达式(第三方库如 robfig/cron)实现更复杂的计划任务;

支持任务失败重试与日志记录机制。

七、结语

通过 time.Ticker 和 goroutine,Go 可以非常优雅地实现定时任务调度器。虽然标准库方案简单,但足以应对大多数日常应用。你可以在此基础上封装出强大的任务调度框架,用于后台服务、数据处理、定时推送等业务场景。

到此这篇关于基于Go语言轻松构建定时任务调度器的示例代码的文章就介绍到这了,更多相关Go定时任务调度器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 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 高效排序数据详情

    Golang 高效排序数据详情

    本文我们介绍了怎么使用 Golang 语言标准库 sort 包排序数据,需要注意的是,除了本文使用的类型之外,其它任意类型只要实现 sort.Interface 的三个方法,都可以调用 sort.Sort() 函数排序数据。
    2021-11-11
  • golang环形队列实现代码示例

    golang环形队列实现代码示例

    这篇文章主要介绍了golang环形队列实现代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 教你一分钟配置好Go语言开发环境(多种操作系统)

    教你一分钟配置好Go语言开发环境(多种操作系统)

    在这篇文章中,我们从头到尾一步步指导你配置Golang开发环境,并编写你的第一个"Hello, World!"程序,我们详细解释了在多种操作系统(包括Windows、Linux和macOS)下的安装过程、环境变量设置以及如何验证安装是否成功
    2023-09-09
  • Go语言中使用gorm小结

    Go语言中使用gorm小结

    这篇文章主要给大家介绍了Go语言中如何使用gorm,文中介绍的很详细,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12

最新评论