Daily Study
更新: 1/29/2026 字数: 0 字 时长: 0 分钟
Daily Plan
#todo
Go pool
- Worker Pool (协程池):管理 CPU 和 调度。控制并发数量,防止 Goroutine 泛滥。
- sync.Pool (对象池):管理 内存 和 GC。复用临时对象,减少内存分配频率。
Worker pool (G池)
核心目标:限制并发数,防止瞬时流量把系统打挂。复用Goroutine,虽然G的创建销毁很快,但复用长期运行的Worker仍能节省调度开销。削峰填谷,配合Buffered channel,暂存突发请求。
实现原理:Producer-Consumer模型,一般使用第三方库 ant
Sync.pool(对象池)
核心目标:减轻GC的压力,包括:对象复用(对象复用了,堆上的垃圾就少了,GC 就不需要频繁 Stop The World),减少malloc(避免频繁向操作系统申请内存)
核心思想:把池子拆散,分给每个 P 一个,从而实现无锁。原理:Go 的 GMP 模型中,同一时刻,一个 P 只能运行一个 G。如果 G 操作的是当前 P 本地的池子,就天然不存在并发冲突,完全不需要加锁。
源码讲解见:sync
sync.Pool 的底层是一个分片式的缓存架构。 它的核心结构是 [P]poolLocal 数组,每个 P 拥有独立的存储空间。 这个存储空间分为两部分:
- Private (私有区):仅当前 P 可访问,读写完全无锁,性能最高。
- Shared (共享区):是一个双端队列。当前 P 生产,其他 P 可以通过 Work Stealing 机制从尾部偷取,这极大地平衡了不同线程间的对象供需。
此外,它还有两个关建细节: 一是利用 Cache Line Padding 解决了多核 CPU 下的伪共享问题; 二是利用 Victim Cache 机制,让对象能活过一次 GC,避免了 GC 后的性能抖动。
