请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

limiter的实现里面 GetConn()这个方法有一定几率造成request堵塞(求解释)

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
}

上面这个是写的,读的同样可以这样用

0 回复 有任何疑惑可以回复我~
  • 提问者 慕粉3250980 #1
    亲测可用。谢谢
    回复 有任何疑惑可以回复我~ 2018-07-17 16:07:43
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号