0

0

如何在 Go 中使用 cron 定时执行方法(含完整可运行示例)

花韻仙語

花韻仙語

发布时间:2026-01-26 11:02:02

|

781人浏览过

|

来源于php中文网

原创

如何在 Go 中使用 cron 定时执行方法(含完整可运行示例)

本文详解如何在 go 程序中正确使用 robfig/cron 库实现定时任务,解决因主 goroutine 过早退出导致任务不执行的问题,并提供带信号监听的健壮启动模式。

在 Go 中使用 github.com/robfig/cron(v2 及以下版本)实现定时任务时,一个常见误区是:程序启动 cron 后立即退出,导致后台任务无机会执行。这是因为 cron.Start() 启动的是一个后台 goroutine,而 main() 函数若执行完毕,整个进程就会终止——无论 cron 是否已注册任务。

? 问题定位

原始代码存在两个关键问题:

  • Cron 表达式错误:"1 * * * * *" 表示“秒字段为 1 时触发”,即每分钟第 1 秒执行一次(并非每秒),实际是每 60 秒执行一次;
  • 缺少主程序阻塞机制:c.Start() 后未保持主线程存活,main() 函数结束 → 进程退出 → 所有 goroutine 被强制终止。

✅ 正确做法:启动 + 持续等待 + 优雅退出

推荐使用 os/signal 监听系统中断信号(如 Ctrl+C),让主 goroutine 阻塞等待,同时允许用户主动终止服务:

Sheet+
Sheet+

Excel和GoogleSheets表格AI处理工具

下载
package main

import (
    "fmt"
    "os"
    "os/signal"
    "time"

    "github.com/robfig/cron"
)

func main() {
    c := cron.New()

    // ✅ 正确的每秒执行表达式(6 字段 cron,支持秒)
    c.AddFunc("* * * * * *", RunEverySecond)

    // ✅ 在 goroutine 中启动 cron(非阻塞)
    go c.Start()

    // ✅ 主 goroutine 等待中断信号(如 Ctrl+C)
    sig := make(chan os.Signal, 1)
    signal.Notify(sig, os.Interrupt, os.Kill)
    fmt.Println("Cron started. Press Ctrl+C to exit.")
    <-sig // 阻塞至此,直到收到信号

    fmt.Println("Shutting down...")
    c.Stop() // ✅ 建议显式调用 Stop() 释放资源(v2+ 支持)
}

func RunEverySecond() {
    fmt.Printf("[%s] Task executed\n", time.Now().Format("15:04:05"))
}

⚠️ 注意事项与最佳实践

  • Cron 表达式格式:robfig/cron v2 默认支持 6 字段(秒 分 时 日 月 周),如需每秒执行,请用 "* * * * * *";若误用 5 字段(如 "* * * * *"),库会自动补零为 "0 * * * * *"(即每分钟第 0 秒执行)。
  • 避免 c.Start() 后直接 time.Sleep():虽可临时阻塞,但不响应中断、不可控且不专业。
  • 资源清理:调用 c.Stop() 可关闭内部 ticker 并防止 goroutine 泄漏(v2+ 版本推荐)。
  • 生产环境建议:考虑使用更现代的替代库(如 github.com/go-co-op/gocron)或 time.Ticker + select 实现轻量级轮询;若需分布式/持久化调度,应选用专有服务(如 Quartz、Temporal)。

通过以上结构,你的 Go 定时任务将稳定运行、可观测、可中断,真正满足长期守护型作业需求。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

327

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

234

2023.10.07

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

482

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

482

2023.08.10

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

532

2026.01.21

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

70

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

297

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

469

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 3万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号