目录
什么是 Goroutine,它与线程有何区别?
如何创建一个 Goroutine?有哪些方式?
Goroutine 执行函数时传递参数应注意什么问题?
使用 Goroutine 时如何确保主线程不会提前退出?
多个 Goroutine 写共享变量时会出现什么问题?如何解决?
如何用 sync.WaitGroup 管理 Goroutine 生命周期?
如何优雅地停止一个正在运行的 Goroutine?
Goroutine 在什么情况下会泄露?如何检测和避免?
Go 中 Goroutine 的栈空间如何管理?会自动扩展吗?
使用 Goroutine 实现并发爬虫应注意哪些问题?
为什么说 Go 的并发是“协作式”而不是“抢占式”?
Goroutine 和线程池有何关系?Go 中是否需要线程池?
如何使用 context 控制 Goroutine 的超时和取消?
Goroutine 数量暴涨会带来哪些性能问题?
如何查看当前运行的 Goroutine 数量?有哪些调试技巧?
Go 中的 Channel 是如何工作的?有哪些底层机制?
Channel 有哪些类型?如何选择合适类型?
Buffered Channel 和 Unbuffered Channel 有什么区别?
为什么说 Channel 是 CSP 模型的实现?
关闭一个 Channel 后还能读写吗?会发生什么?
Goroutine 执行函数时传递参数应注意什么问题?
使用 Goroutine 时如何确保主线程不会提前退出?
多个 Goroutine 写共享变量时会出现什么问题?如何解决?
如何判断一个 Channel 是否已经被关闭?
使用 select 实现多路复用时应该注意哪些陷阱?
什么是 nil channel?它在 select 中的行为是什么?
如何使用 Channel 实现 Goroutine 的并发控制?
如何使用 Channel 构建一个生产者-消费者模型?
Go 中的 GMP 模型分别代表什么?
Goroutine 是如何在 M 上调度运行的?
G 是如何从 P 获取的?调度器如何分配任务?
Go 中的线程(M)是否等于系统线程?
调度器如何感知 Goroutine 被阻塞或唤醒?
Go 中的 GMP 模型分别代表什么?
Goroutine 是如何在 M 上调度运行的?
G 是如何从 P 获取的?调度器如何分配任务?
Go 中的线程(M)是否等于系统线程?
调度器如何感知 Goroutine 被阻塞或唤醒?
Go 中的 GMP 模型分别代表什么?
Goroutine 是如何在 M 上调度运行的?
G 是如何从 P 获取的?调度器如何分配任务?
Go 中的线程(M)是否等于系统线程?
调度器如何感知 Goroutine 被阻塞或唤醒?
当 Goroutine 数量远远大于 P 时会发生什么?
如何使用 GOMAXPROCS?它与 P 有什么关系?
Go 是怎么实现用户态和内核态之间的切换的?
GMP 模型如何支持异步 IO 操作?
Go 1.14 后引入了“抢占式调度”,它是如何实现的?
一、信号触发抢占
二、函数序言插桩
三、抢占流程
四、与协作式调度的对比
五、优化与限制
sync.Mutex 的实现原理是什么?它如何避免竞态?
sync.RWMutex 适用于哪些场景?与 Mutex 有何不同?
atomic 包与 sync 包的区别与适用场景?
sync.Once 的内部机制是什么?它是线程安全的吗?
Go 中是否支持信号量?如何模拟实现?
sync.Map 的底层结构与性能特点?
底层结构
性能特点
适用场景与限制
与普通 map+Mutex 的对比
注意事项
为什么不推荐在多个 Goroutine 中直接共享 map?
一、map 的非线程安全特性
二、底层实现的风险细节
三、Go 官方的明确限制
四、替代方案与最佳实践
五、总结:为什么不推荐?
使用 pprof 工具分析 Goroutine 泄漏的方法?
一、pprof 简介与开启方式
二、分析 Goroutine 泄漏的核心步骤
1. 获取 Goroutine 堆栈信息
2. 解析输出内容
3. 过滤与分组堆栈
4. 对比不同时间点的堆栈
5. 结合业务逻辑分析
三、实战案例:诊断通道阻塞导致的泄漏
四、最佳实践与注意事项
如何调试 Go 程序中的死锁问题?
一、利用运行时自动检测
二、手动分析死锁的常见场景
1. 通道死锁
2. 互斥锁死锁
3. WaitGroup 死锁
三、使用 pprof 诊断死锁
四、实战调试步骤示例
五、预防死锁的最佳实践
实战中如何选择 Goroutine 数量与 Channel 缓冲区大小?
一、Goroutine 数量的选择原则
1. CPU 核数与 P 的数量
2. 任务类型(CPU 密集型 vs IO 密集型)
3. 系统资源限制
4. 动态调整与监控
二、Channel 缓冲区大小的选择策略
1. 无缓冲通道(缓冲区大小 0)
2. 有缓冲通道(缓冲区大小 >0)
3. 经验法则与计算方法
4. 动态调整与压力测试
三、实战案例:文件处理系统
四、常见误区与注意事项