发布时间:2026/7/13 4:10:38
(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 退出

相关新闻

2026/7/13 4:10:38

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

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

2026/7/13 4:10:38

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

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

2026/7/13 4:10:38

torchvision数据集及DataLoader的使用

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

2026/7/13 5:50:45

免费获取9大网盘真实下载链接:网盘直链下载助手终极教程

免费获取9大网盘真实下载链接:网盘直链下载助手终极教程 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…

2026/7/13 5:50:45

案例计算题一碰到“挣值”就头疼?三个口诀让你当场算对SV和CV

高项案例计算题中,挣值分析几乎必考,但很多考生上了考场看到PV、EV、AC就晕,公式背了一堆,一到具体计算就乱套。本文分享一套“挣值三口诀”——看方向、比大小、判偏差,配合一个还原真实项目的计算场景,帮…

2026/7/13 5:50:45

原来重庆还有专业安装多功能厅音响的厂家?究竟啥样?

在重庆,专业音响领域发展态势良好,尤其是在多功能厅音响安装方面,有不少厂家提供相关服务。重庆优沃科技作为西南地区深耕多年的音视频系统集成与智能化弱电工程服务商,在这方面有着独特之处。多功能厅音响安装市场现状目前&#…

2026/7/13 5:50:45

渗透测试实战:从弱口令到内网漫游的5个关键步骤与工具链

渗透测试实战进阶:从入口突破到内网控制的深度技术解析当企业数字化转型进入深水区,网络安全防线面临的挑战已从单点防御演变为立体化攻防对抗。2024年Verizon数据泄露调查报告显示,83%的成功入侵始于外围系统的薄弱环节,其中弱口…

2026/7/13 5:50:45

Adobe-GenP 3.0破解工具:三步解锁Adobe全家桶的终极方案

Adobe-GenP 3.0破解工具:三步解锁Adobe全家桶的终极方案 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 还在为Photoshop、Premiere Pro等Adobe软件的高…

2026/7/12 0:01:29

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/12 0:01:29

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/12 0:01:29

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/13 0:00:24

广氟 PTFE 高速线缆膜 —— 高端线缆绝缘材料新选择

PTFE高速线缆膜的基本概念与特点 PTFE 高速线缆膜是以聚四氟乙烯树脂为原料,经膨化双向拉伸制成的多孔绝缘薄膜,作为高速高频通信线缆的核心介质材料,内部形成均匀连通的微孔结构,兼具极低介电常数与介电损耗,能有效降…

2026/7/12 11:21:32

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…