并发 [2][1] #
并发原语 #
-
sync.Once [3]
- 保证在 Go 程序运行期间的某段代码只会执行一次
-
sync.Pool [3]
- 两种场景中可以使用Pool做优化
- 进程中的inuse-objects数过多, gc mark 消耗大量CPU
- 进程中的inuse-objects数过多, 进程RSS占用过高
- 最佳实践 请求生命周期开始时,pool.Get, 请求结束时, pool.Put
- 两种场景中可以使用Pool做优化
-
semaphore 信号量 [3]
- 是锁的实现基础, 所有同步原语的基础设施
- 内部结构
- treap tree+heap
- 二插搜索树 树上的每个节点都是一个链表
- 小顶堆
- treap tree+heap
-
sync.Mutex 互斥锁 [3]
- 内部结构
- state 饥饿模式: 最新进自旋的goroutine优先级最高 非饥饿模式: 排队
- sema 信号量
- 内部结构
-
sync.RWMutex 读写锁 [3]
- 内部结构
- w
- writerSem
- readerSem
- readerCount
- readerWait
- 内部结构
-
sync.Map [3]
- 线程安全的Map
- 内部结构
- mu
- read
- dirty
- misses
- 设计
- map+lock 多核扩展性差一点
- sync.Map 在读多写少的情况下,基本上不需要加锁
-
sync.WaitGroup [3]
- 等待一组 Goroutine 的返回
- 内部结构
- state1
-
sync.Cond
- 让一组的 Goroutine 都在满足特定条件时被唤醒
-
sync.Context
- 进行上下文信息传递、提供超时和取消机制、控制子 goroutine 的执行
Context [6] #
进行上下文信息传递、提供超时和取消机制、控制子 goroutine 的执行
func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
func WithDeadline(parent Context, d time.Time) (Context, CancelFunc)
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
应用&扩展 #
控制 goroutine 的并发数量 [5] #
并发编程模式 [3][4] #
- fan-in 合并两个channel
- or channel 多个channel有任一个channel有返回, 就直接返回这个值。
- pipeline 串联在一起的channel
扩展并发原语 #
errgroup Semaphore SingleFlight
参考 #
- GOLANG ROADMAP
GOLANG ROADMAP
邀请码:caspar 邀请码:Gopher-10645-1382 - 《Go 并发编程实战课》 极客时间 鸟窝
- 《15 辅导 + 案例分析 + 答疑-更多课程》 体系课_Go高级工程师实战营(完结)
- « 14 | Channel:透过代码看典型的应用模式 » Go 并发编程实战课 鸟窝
- 1.6 来,控制一下 goroutine 的并发数量
- context 曹大