Go并发限制怎么写?

有一个搜索业务函数,假设说叫Search(kw string)

现在正常情况是并发调用。go Search("hello")

现在想给这个Search套一个cache,缓存的key就是这一个参数。

希望同时出现数个相同kw的调用时候,等待第一个完成进入缓存后,再放行后边的。

不知道该怎么写,求教大佬。

共 2 个回复


jgn_go

func Search(kw string,noticeCh chan int,kwCh chan string) {
for {
select {
case <-noticeCh://拿到通知后,去设置缓存
kwCh<-kw
noticeCh<-1//设置完成后,通知其他协程
default:
fmt.Println("waiting")
}
time.Sleep(1*time.Second)
}
}

func main() {
i:=0//并发数
noticeCh := make(chan int,1)//完成通知
kwCh := make(chan string)//使用无缓冲chan,并发后按顺序设置cache
wg := &sync.WaitGroup{}//控制读协程退出
noticeCh<-1
for i<100 {//起100个协程设置缓存
go Search("hello",noticeCh,kwCh)
i++
}
wg.Add(1)
go func(wg *sync.WaitGroup) {//起一个消费协程执行设置缓存逻辑
n:=1
lock := sync.Mutex{}
for {
select {
case v:=<-kwCh:
lock.Lock()
//todo::执行设置缓存逻辑
fmt.Println("第",n,"次设置key:",v)
n++
lock.Unlock()
}
if n == 11 {//模拟设置10次后退出
wg.Done()
return
}
}
}(wg)
wg.Wait()
}
//不知道是否满足你的需求

# 0

17638197165

golang.org/x/sync/singleflight
这个包可以参考下,我感觉你的业务场景可能更适合这个模式

多个相同请求打进来,只做一个查询,其余请求等待一个查询完成后返回相同数据。

# 1