新闻中心
如何用Golang实现定时任务并发执行_Golang 定时任务并发实践
在Golang中实现定时任务并发执行需结合time.Ticker与goroutine,每个任务通过独立goroutine和ticker周期触发,互不阻塞;示例中startTask函数用ticker定期执行任务,main函数启动多个任务并保持主协程运行;为保证并发安全,共享资源访问需使用sync.Mutex等机制保护;动态管理任务可通过stopCh等channel控制ticker生命周期,实现任务的动态启停与频率调整。

在 Golang 中实现定时任务并发执行,关键在于结合 time.Ticker 或 time.Sleep 与 goroutine 的使用。通过合理设计,可以做到多个任务按固定周期独立运行,互不阻塞。
使用 time.Ticker 启动周期性任务
每个定时任务可以用一个独立的 goroutine 驱动,配合 time.NewTicker 实现周期触发。
示例代码:func startTask(name string, interval time.Duration) { ticker := time.NewTicker(interval) defer ticker.Stop() <pre class="brush:php;toolbar:false;">for range ticker.C { fmt.Printf("执行任务: %s, 时间: %s\n", name, time.Now().Format("15:04:05")) // 模拟任务处理耗时 time.Sleep(1 * time.Second) }
}
func main() { go startTask("任务A", 3time.Second) go startTask("任务B", 5time.Second)
// 主协程保持运行
select {}}
这种方式让每个任务独立计时、并发执行,不会因某个任务耗时影响其他任务的调度节奏。
控制并发安全与资源竞争
当多个定时任务操作共享资源(如日志文件、数据库连接池),需注意并发安全。
- 使用 sync.Mutex 保护临界区
- 避免在定时任务中长时间持有锁
- 考虑用 channel 代替锁进行通信协调
例如写日志时加锁:
美图云修
商业级AI影像处理工具
50
查看详情
var logMutex sync.Mutex
<p>func safeLog(msg string) {
logMutex.Lock()
defer logMutex.Unlock()
fmt.Println(msg)
}</p>
动态管理定时任务
实际场景中可能需要添加、停止或调整任务频率。可通过 channel 控制 ticker 生命周期。
示例:可取消的任务
func startCancelableTask(name string, interval time.Duration, stopCh <-chan bool) {
ticker := time.NewTicker(interval)
defer ticker.Stop()
<pre class="brush:php;toolbar:false;"><code>for {
select {
case <-ticker.C:
fmt.Printf("执行: %s, 时间: %s\n", name, time.Now().Format("15:04:05"))
case <-stopCh:
fmt.Printf("任务 %s 已停止\n", name)
return
}
}
}
// 使用方式 stopB := make(chan bool) go startCancelableTask("任务B", 5*time.Second, stopB)
// 某个时刻停止 time.AfterFunc(20*time.Second, func() { close(stopB) })
使用第三方库简化开发
对于复杂调度需求(如 cron 表达式),推荐使用成熟库:
- robfig/cron:支持标准 cron 语法
- gocron:链式 API,易于使用
以 cron 为例:
c := cron.New()
c.AddFunc("*/1 * * * *", func() { // 每分钟执行
fmt.Println("Cron 任务触发")
})
c.Start()
基本上就这些。Golang 原生机制已足够支撑大多数定时并发场景,重点是理解 goroutine 生命周期和 channel 控制。简单任务用 ticker + goroutine,复杂调度再引入第三方库,结构清晰又不易出错。
以上就是如何用Golang实现定时任务并发执行_Golang 定时任务并发实践的详细内容,更多请关注其它相关文章!
# golang
# go
# 药企学术推广营销方案
# 青岛seo网站建设
# 灵猴seo
# 南通营销推广中心
# 大兵seo博客广告
# 晋江网站建设排名前十
# 山阳区推广网站搭建收费
# 沈阳seo推广登陆评价
# 怀孕初期关键词排名
# 四川重庆网站推广
# 中文网
# 相关文章
# 推荐使用
# 可以用
# 第三方
# 可通过
# 链式
# 如何用
# 多个
# 美图
# 有锁
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
React Hooks最佳实践:动态组件状态管理的组件化方案
Go语言中Map值调用指针接收器方法的限制与应对
QQ邮箱登录官网首页 腾讯QQ邮箱网页入口
高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】
机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等
蛙漫安全无毒 官方认证的绿色入口
蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】
优化Django表单:提交验证失败后保留用户输入
品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程
Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法
在J*a中如何隐藏复杂性_使用门面模式组织对象交互
台积电1.4nm工艺A14瞄准2028:10年来性能提升80%
蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接
漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址
c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析
Python自定义类排序:解决lambda键值访问TypeError的实践指南
UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS
win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】
如何使用Go和Martini动态服务解码后的图片
QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口
Composer中的^和~符号代表什么_精通Composer版本号语义化约束
python3时间如何用calendar输出?
Golang如何优化CPU绑定任务分配策略_Golang CPU任务分配优化实践
Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项
QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台
聚水潭ERP登录页面入口 聚水潭ERP官网登录界面
Android Studio计算器C键功能异常排查与修复教程
在Runstone环境中高效处理TasteDive API的JSON数据
J*aScript Promise链中如何正确终止后续.then执行并处理错误
C#中解析不规范的HTML为XML 常见的坑与解决办法
解决Django多数据库/多Schema环境下外键迁移问题
内存疯狂猛猛涨价:主板销量直接腰斩!
整合Supabase认证与Django模型:跨模式迁移的解决方案
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
AO3最新镜像入口 Archive of Our Own官方平台访问
Yandex浏览器官方网页版入口 Yandex浏览器最新版官网
苹果手机如何防止被恶意App追踪
汽水音乐网页版使用入口_汽水音乐电脑版播放指南
高德地图沿途添加点失败如何解决 高德多点规划方法
葱吃多了会怎样 葱吃多了会伤胃吗
c++中为什么推荐使用using替代typedef_c++现代化类型别名
QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台
《噬血代码2》新预告片发布 展示游戏剧情
知音漫客官网漫画下载_知音漫客网页版阅读记录
神庙逃亡小游戏在线玩 神庙逃亡小游戏入口
三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】
深入理解J*aScript Promise异步执行与微任务队列
可靠CSGO开箱平台解析 CSGO开箱网合集
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
谷歌邮箱注册显示错误Gmail服务器异常与延迟处理


2025-11-25
浏览次数:次
返回列表
name string, interval time.Duration) {
ticker := time.NewTicker(interval)
defer ticker.Stop()
<pre class="brush:php;toolbar:false;">for range ticker.C {
fmt.Printf("执行任务: %s, 时间: %s\n", name, time.Now().Format("15:04:05"))
// 模拟任务处理耗时
time.Sleep(1 * time.Second)
}