waitgroup
waitgroup比较简单,当add的总数跟done的总数一样,通过信号量唤醒WaitGroup.wait()方法
有兴趣的可以了解下semtable后阅读下源码,挺简单的
type WaitGroup struct {
noCopy noCopy
//类似锁,需要注意高32位低32有大小端问题 add总数-wait总数
state atomic.Uint64 // high 32 bits are counter, low 32 bits are waiter count.
//存储在semtable上,上文有详细讲解
sema uint32
}
SingleFlight
//todo 时间关系未更完有空补充完
SingleFlight主要用于多个并发操作,只执行其中一个,例如多个get操作,防止缓存击穿
主要就是一个map加锁,多个操作通过map只执行一次,通过WaitGroup等待请求的返回
type Group struct {
mu sync.Mutex // protects m
m map[string]*call // lazily initialized
}
type call struct {
wg sync.WaitGroup
val any
err error
//累计多少个请求
dups int
chans []chan<- Result
}