基于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定时任务调度器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Go语言实现压缩文件处理

    基于Go语言实现压缩文件处理

    在现代的应用开发中,处理压缩文件(如 .zip 格式)是常见的需求,本文将介绍如何使用 Go 语言封装一个 ziputil 包,来处理文件的压缩和解压操作,需要的可以了解下
    2024-11-11
  • Go中字符串处理 fmt.Sprintf与string.Builder的区别对比分析

    Go中字符串处理 fmt.Sprintf与string.Builder的区别对比分析

    在Go语言中,我们通常会遇到两种主要的方式来处理和操作字符串:使用fmt.Sprintf函数和string.Builder类型,本文给大家介绍它们在性能和用法上有一些关键区别,感兴趣的朋友跟随小编一起看看吧
    2023-11-11
  • 浅谈Go Slice 高级实践

    浅谈Go Slice 高级实践

    这篇文章主要介绍了浅谈Go Slice 高级实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Golang解析yaml文件操作指南

    Golang解析yaml文件操作指南

    之前一直从事java开发,习惯了使用yaml文件的格式,尤其是清晰的层次结构、注释,下面这篇文章主要给大家介绍了关于Golang解析yaml文件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Go语言LeetCode题解682棒球比赛

    Go语言LeetCode题解682棒球比赛

    这篇文章主要为大家介绍了Go语言LeetCode题解682棒球比赛示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • golang跳转语句goto,break,continue的使用及区别说明

    golang跳转语句goto,break,continue的使用及区别说明

    这篇文章主要介绍了golang跳转语句goto,break,continue的使用及区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang 协程配合管道的实现示例

    Golang 协程配合管道的实现示例

    本文主要介绍了Golang协程配合管道的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • 正则表达式在Go字符串处理中的实战应用代码

    正则表达式在Go字符串处理中的实战应用代码

    在Go语言中,正则表达式与字符串处理是强大的工具,能够大幅提升文本处理效率,下面这篇文章主要介绍了正则表达式在Go字符串处理中实战应用的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-03-03
  • Go函数全景从基础到高阶深度剖析

    Go函数全景从基础到高阶深度剖析

    本文深入探索Go语言中的函数特性,从基础函数定义到特殊函数类型,再到高阶函数的使用和函数调用优化,通过详细的代码示例和专业解析,读者不仅可以掌握函数的核心概念,还能了解如何在实践中有效利用这些特性来提高代码质量和性能
    2023-10-10
  • Go语言学习之数组的用法详解

    Go语言学习之数组的用法详解

    数组是相同数据类型的一组数据的集合,数组一旦定义长度不能修改,数组可以通过下标(或者叫索引)来访问元素。本文将通过示例详细讲解Go语言中数组的使用,需要的可以参考一下
    2022-04-04

最新评论