标题描述的不够清楚。
使用golang创建传统的web服务,通过路由访问后端接口,在该接口中有较多的数据库查询操作,举个例子:
func Test() {
go func() {
// 查询1
}()
go func() {
// 查询2
}()
go func() {
// 查询3
}()
}
将查询(每个查询都相互独立,没有依赖)放到多个goroutine中,理论上是能够提高这个接口的响应速度的。那么问题来了,在高并发的情况下,会创建大量的goroutine, 在后端是否有必要去做一个限制goroutine数量的操作?如何优雅的实现这样的操作。我大概看了一下网上的文章:
type Grpool struct {
queue chan uint8
wg *sync.WaitGroup
}
func (gp *Grpool) Add(n int) {
for i := 0; i < n; i++ {
gp.queue <- uint8(1)
}
gp.wg.Add(n)
}
func (gp *Grpool) Done() {
<- gp.queue
gp.wg.Done()
}
func (gp *Grpool) Wait() {
gp.wg.Wait()
}
通过上面的结构来实现阻塞wg.Add的操作。但问题是我构建了一个全局单例的Grpool对象:pool, 并且在下面的代码中进行使用:
func Test() {
pool.Add(3)
go func() {
// 查询1
pool.Done()
}()
go func() {
// 查询2
pool.Done()
}()
go func() {
// 查询3
pool.Done()
}()
pool.Wait()
}
但是,在pool.Wait()的时候是有问题的,因为pool是全局单例的,当有别的用户调用该接口的时候,pool.Wait可能会一直处于阻塞状态