context通过发送取消信号控制goroutine生命周期,不能直接终止,需goroutine主动退出。2. 使用WithCancel或WithTimeout创建可取消的context,通过Done() channel通知取消。3. 必须调用cancel函数释放资源,避免泄漏。4. 多层goroutine需传递context实现级联取消。5. 结合select监听取消、定时器等多事件。

在Go语言中,context 是控制goroutine生命周期的核心机制。当你需要取消正在运行的goroutine,比如用户请求中断、超时或程序关闭时,context提供了标准方式来传递取消信号。下面介绍几种常见且实用的使用模式。
Context本身不能直接“杀死”goroutine,它通过发送通知让目标goroutine主动退出。每个context可以携带一个只读的Done() channel,当该channel被关闭时,表示上下文已被取消。
关键点:
这是最基础的场景,主程序启动goroutine后,在某个条件满足时主动取消。
func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel()go func(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("goroutine退出:", ctx.Err())
return
default:
fmt.Println("工作中...")
time.Sleep(500 * time.Millisecond)
}
}
}(ctx)
time.Sleep(2 * time.Second)
cancel() // 触发取消
time.Sleep(1 * time.Second) // 等待退出 }
很多场景不需要手动cancel,而是设定超时时间自动终止任务。
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel()go func() {
timer := time.NewTimer(5 * time.Second)
select {
case
fmt.Println("任务完成")
case
fmt.Println("任务被取消:", ctx.Err())
if !timer.Stop() {
}
}
}()
3秒后ctx.Done()触发,即使任务未完成也会退出。注意处理timer避免资源泄漏。
刺鸟创客
一款专业高效稳定的AI内容创作平台
110
查看详情
当一个goroutine又启动了子goroutine时,必须将context继续传递下去,确保整条调用链都能响应取消。
go func(parentCtx context.Context) { childCtx, childCancel := context.WithCancel(parentCtx) defer childCancel()go func() {
for {
select {
case <-childCtx.Done():
fmt.Println("子goroutine退出")
return
default:
time.Sleep(300 * time.Millisecond)
}
}
}()
// 模拟工作
time.Sleep(2 * time.Second) }(ctx)
父级context取消时,childCtx也会被触发,实现级联退出。
实际开发中,goroutine往往要同时监听取消、数据到达、定时器等多种事件。
for { select { case只要任意一个case触发就会跳出循环,其中ctx.Done()优先级最高。
基本上就这些。掌握context取消的核心在于:传递context、监听Done channel、及时调用cancel。只要遵循这些原则,就能写出可控制的并
发程序。
以上就是如何在Golang中使用context取消goroutine_Golang context取消goroutine实践汇总的详细内容,更多请关注其它相关文章!
# 不需要
# 石家庄新站seo建议
# 旅游营销推广有什么作用
# 松原seo助手多少钱
# 英文seo查询软件
# 虾皮的营销与推广
# 甘肃电商网站推广
# seo策略比seo技术更重要
# 企业网站建设推广哪家好
# 萝岗区网站推广
# 阆中古城的营销推广策略
# 都能
# go
# 就能
# 就会
# 级联
# 这是
# 如何在
# 自定义
# 也会
# 死锁
# ai
# go语言
# golang
相关文章:
windows10怎么关闭系统提示音_windows10彻底静音设置方法
Python中高效访问嵌套字典与列表中的键值对
小米汽车11月交付量突破40000台!雷军:将继续努力
Python Socket多播通信中指定源IP地址的实践指南
VS Code远程开发时如何处理文件权限问题
斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程
Lar*el递归关系中排除子孙节点的策略
c++如何使用chrono库处理时间_c++标准库时间与日期操作
包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址
在PHP脚本中通过SSHFS挂载远程文件系统的最佳实践与常见问题解决
铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧
顺丰国际快递查询 国际件官方查询入口
如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式
c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学
PHP基于会话的用户类型页面访问控制指南
高德地图沿途添加点失败如何解决 高德多点规划方法
cad如何更改注释性对象的比例_cad注释性比例调整方法
html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】
如何在CSS中使用浮动制作导航栏_float实现水平菜单
Django通过AJAX异步上传图片并保存至模型的完整指南
微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法
解决Flask中Quill编辑器内容提交失败及TypeError的指南
Python中如何避免重复条件判断:利用数据结构实现动态逻辑
excel如何生成目录 excel一键生成工作表目录超链接
《噬血代码2》新预告片发布 展示游戏剧情
字由网在线版登录地址 字由网网页版安全入口
Python异步编程实践:使用Binance API构建实时交易数据流
台积电1.4nm工艺A14瞄准2028:10年来性能提升80%
C++ string find函数返回值npos详解_C++字符串查找失败的判断条件
Tailwind CSS line-clamp 布局问题解析与修复指南
C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言
蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台
lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法
Node.js 中使用 node-cron 实现定时 API 数据抓取与处理
知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法
composer的"require-dev"部分是用来做什么的?
CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整
Lar*el Eloquent:高效统计带条件关联模型的数量
三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升
b站怎么取消点赞_b站点赞取消操作方法
必由学网页版入口 必由学官方平台直接访问
深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射
SteamMachine定价或为699美元 大家想入手吗?
CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略
解决J*aScript中重复选择项的确认对话框显示问题
J*aScript Promise链中如何正确终止后续.then执行并处理错误
Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注
Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】
在WordPress中通过REST API访问受BasicAuth保护的站点内容
win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】
*请认真填写需求信息,我们会在24小时内与您取得联系。