(1/26)GO练习题-Goroutinue泄漏
某电商公司的订单服务上线后运行了大约 2 小时OOMOut of Memory被 K8s 杀死进程反复重启。运维同事看到的日志只有一行fatal error: runtime: out of memory。开发同事重启了几次问题依旧。直到有经验的架构师用 pprof 看了一眼 goroutine 分布才发现每处理一个请求就 leak 一个 goroutine而且这些 goroutine 全部卡在 channel 的 send 操作上永远无法退出。1000 个 QPS × 2 小时 720 万次泄露的 goroutine每个 goroutine 默认 2KB 栈空间再加上分配的堆对象最终把内存吃光了。教训goroutine 泄露是 Go 生产环境中最隐蔽、危害最大的并发问题之一。没有之一。学习目标理解 goroutine 的生命周期谁启动、谁负责停止理解 channel 阻塞如何导致 goroutine 泄露掌握 context.WithCancel 的正确用法和取消传播链学会用 net/http/pprof 检测 goroutine 泄露问题描述下面的代码是一个模拟的请求处理函数。每个请求启动一个 worker goroutine 来处理任务并将结果发送到 channel。但这段代码有一个 goroutine 泄露——worker goroutine 在完成工作后试图向 resultCh 发送结果时如果没有人读取就会永远阻塞。请找出泄露点并修复它。原始代码有 BUGpackage mainimport (“fmt”“math/rand”“time”)func simulateRequest() {resultCh : make(chan string) // 无缓冲// 启动 worker goroutine 处理请求 go func() { // 模拟耗时处理300~800ms time.Sleep(time.Duration(rand.Intn(500)300) * time.Millisecond) resultCh - fmt.Sprintf(处理完成耗时 %dms, 300rand.Intn(500)) // TODO: 这里会泄露——如果 resultCh 没人读goroutine 永远卡住 }() // TODO: 模拟请求取消或超时的情况比如 500ms 后调用方不再关心结果 // 如果 worker 还没完成它就 leak 了 time.Sleep(500 * time.Millisecond) // 这里不会收到结果因为 goroutine 已经被阻塞在 send 上了 fmt.Println(请求方放弃等待)}func main() {for i : 0; i 5; i {simulateRequest()fmt.Printf(“第 %d 个请求处理完毕\n\n”, i1)time.Sleep(200 * time.Millisecond)}fmt.Println(“所有请求处理完毕”)// 运行后观察goroutine 数量只增不减time.Sleep(2 * time.Second)}预期现象运行后 goroutine 数量持续增长因为这些 goroutine 卡在 resultCh - … 上无法退出。修复要求使用 context.WithCancel 修复泄露问题确保worker goroutine 能感知到取消信号及时退出使用 defer cancel() 确保清理修复后运行goroutine 数量保持稳定面试追问Q1: 如何用 pprof 检测 goroutine 泄露答// 在 HTTP 服务中启用 pprofimport _ “net/http/pprof”然后通过以下命令检查查看 goroutine 数量curl http://localhost:6060/debug/pprof/goroutine?debug1导出 goroutine profile 到文件curl http://localhost:6060/debug/pprof/goroutine -o goroutine.prof用 pprof 工具分析go tool pprof goroutine.prof生产环境中定期采集 goroutine 数量并设置告警是必要的。Q2: channel 阻塞的 4 种情况场景 谁阻塞 是否泄露1 sendCh - val无人接收 发送方 是发送方 goroutine 永久阻塞2 -recvCh无人发送 接收方 是接收方 goroutine 永久阻塞3 双向 channel两端都关闭后继续读写 读写方 是panic 或永久阻塞4 select 中没有 default 分支所有 case 都阻塞 select 所在 goroutine 是goroutine 永久阻塞Q3: 如何用 context 预防 goroutine 泄露答核心原则——所有从请求衍生出的 goroutine都应该传入同一个 context并在 context 取消时优雅退出。func handler(ctx context.Context) {ctx, cancel : context.WithCancel(ctx)defer cancel() // 关键无论什么路径退出都调用 cancelgo func() { defer fmt.Println(goroutine 已退出) select { case -ctx.Done(): return // context 取消优雅退出 case resultCh - doWork(): // 发送成功正常退出 return } }() // ... 处理逻辑}context 取消传播链用户请求取消 / 超时→ handler 的 context 被 cancel→ 所有通过 context.WithCancel/WithTimeout 衍生出的子 context 被 cancel→ 所有 select 中 case -ctx.Done() 分支触发→ 所有衍生 goroutine 退出

相关新闻

XAI不是加解释模块,而是重构AI交付全流程

XAI不是加解释模块,而是重构AI交付全流程

1. 这不是给算法看的说明书,而是给业务方、监管者和用户写的“信任契约”ExplainableAI(XAI)这个词,这两年在技术会议、合规文档和产品评审会上出现的频率,已经高到让一线工程师听到就想默默关掉会议通知。但绝大多数人…

2026/7/13 4:10:29阅读更多 →
4G、WiFi 6、蓝牙 5.3 物联网选型指南:5 大关键指标与 3 个典型场景

4G、WiFi 6、蓝牙 5.3 物联网选型指南:5 大关键指标与 3 个典型场景

4G、WiFi 6、蓝牙5.3物联网选型实战:5维参数与3大场景深度解析当智能家居的温控器每隔30秒上传一次环境数据,当工业传感器在电磁干扰严重的车间传输振动信号,当运动手环需要同时处理心率监测和音乐播放——这些场景背后,是开发者对…

2026/7/13 4:10:29阅读更多 →
torchvision数据集及DataLoader的使用

torchvision数据集及DataLoader的使用

本文主要介绍torchvision内置数据集及DataLoader使用 文章目录一、CIFAR10 数据集初识(举例)1.一句话理解2.CIFAR10 数据档案3.数据集下载二、查看数据集内容1.基本操作2.数据结构三、与 transforms 联动四、DataLoader — 从"一副牌"到"…

2026/7/13 4:10:29阅读更多 →
Unity Tilemap实战:从《星露谷物语》到《空洞骑士》的2D地图构建指南

Unity Tilemap实战:从《星露谷物语》到《空洞骑士》的2D地图构建指南

1. 项目概述:为什么从经典2D游戏学起?如果你和我一样,是从《星露谷物语》的鹈鹕镇或者《空洞骑士》的遗忘十字路开始,对2D游戏世界着迷,然后萌生了自己动手做一个的念头,那你来对地方了。这两个游戏&#x…

2026/7/13 5:15:35阅读更多 →
Postman 11.2 HTTPS 请求无响应排查:7步定位证书/代理/请求头差异

Postman 11.2 HTTPS 请求无响应排查:7步定位证书/代理/请求头差异

Postman HTTPS请求无响应深度排查指南:从证书校验到网络配置的全链路分析引言:当Postman沉默时发生了什么?作为API开发与测试的核心工具,Postman在发送HTTPS请求时的"沉默"往往让开发者陷入困境——相同的请求在浏览器中…

2026/7/13 5:15:35阅读更多 →
bitArt 系列 02:数据模型

bitArt 系列 02:数据模型

做一个像素画编辑器,最早会遇到的不是 Canvas 怎么画,而是数据怎么存。如果只是画一个 16x16 的网格,直接用二维数组也能跑。但真正的编辑器会很快长出更多需求:多图层、锁定、透明度、撤销重做、动画帧、项目保存、图片导入、GIF…

2026/7/13 5:15:35阅读更多 →
Pandas多维聚合实战:构建可钻取的数据立方体

Pandas多维聚合实战:构建可钻取的数据立方体

1. 项目概述:当数据不再是一张“平铺直叙”的表格你有没有遇到过这样的场景:销售部门要按季度、按区域、按产品大类看毛利,同时还要对比去年同期;财务团队需要把成本拆解到“部门-项目-费用类型-发生月份”四个维度,再…

2026/7/13 5:15:35阅读更多 →
Web安全实战:业务逻辑漏洞挖掘技巧与六大核心攻击面解析

Web安全实战:业务逻辑漏洞挖掘技巧与六大核心攻击面解析

1. 项目概述:为什么业务逻辑漏洞是Web安全的“隐形杀手”?刚入行做渗透测试那会儿,我和很多新手一样,满脑子都是SQL注入、XSS、文件上传这些“经典”漏洞。拿着扫描器一顿狂扫,看到个报错信息就兴奋得不行。直到有一次…

2026/7/13 5:15:34阅读更多 →
Ford-Fulkerson 算法实战:Python 实现最大流问题,5步求解23万吨/小时案例

Ford-Fulkerson 算法实战:Python 实现最大流问题,5步求解23万吨/小时案例

Ford-Fulkerson算法实战:Python实现最大流问题与23万吨/小时案例解析在系统架构设计师的软考备考过程中,图论中的最大流问题是一个既基础又关键的知识点。本文将从实战角度出发,通过Python代码完整实现Ford-Fulkerson算法,并逐步解…

2026/7/13 5:10:34阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/13 4:47:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/13 0:50:34阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/13 4:52:09阅读更多 →
卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

研究痛点提出(提出问题)重组肠激酶是融合标签切除核心工具酶,当前原核表达体系存在三大标准化难题,直接阻碍可复现的蛋白质分离纯化流程搭建:Trx、GST、单 SUMO 标签融合产物绝大多数为包涵体,沉淀占比超 9…

2026/7/13 0:04:58阅读更多 →
语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text …

2026/7/13 0:04:58阅读更多 →
Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你是否曾经想要调整Palwor…

2026/7/13 0:04:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/13 4:21:17阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/13 4:08:53阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/12 21:43:43阅读更多 →