limiter的实现里面 GetConn()这个方法有一定几率造成request堵塞(求解释)
来源:7-11 部署演示以及完成效果展示
慕粉3250980
2018-07-12
func (limiter *ConnLimiter) GetConn() bool {
if len(limiter.bucket) >= limiter.concurrentCon {
log.Printf("流控池已满~~~")
return false
}
//如果并发执行 A协程 判断chan的长度不符合条件未进if分支也未写入chan,B协程这时判断也是不符合if分支 。此时A协程写入chan获取token, B在写入chan的时候chan以满就会造成协程wait吧。
limiter.bucket <- 1
return true
}
写回答
1回答
-
描述没有看太明白,如果A和B同时到达,自然会哪个先拿到token哪个先执行,协程没有wait这一说,或者你的意思是blocking?blocking是有可能的,deadlock也有可能,如果deadlock,则会直接抛panic了。
有些情况会出现blocking,因为比较极端所以我就没在这里加上,就是当A拿到token后但是没有释放发生了中断,或者首次出现read,并且channel是空的时候,就会出现deadlock
那么在这个case里面,如果为了避免你说的blocking/deadlock,我们可以加上select类似于
select { case limiter.bucket <-1: //处理逻辑 default: return false }上面这个是写的,读的同样可以这样用
012018-07-17
相似问题