[TOC]
并发说明
并发,优雅的并发,一般都会用到pool的概念——比如,mysql、redis连接池;比如java/C/C++有线程池,golang有goroutine池;等等。
pool的目的,一是为了cach提高速度;其次就是上限控制——如果无上限的话,就没有必要用pool了。
pool的上限控制,即达到上限之后的处理方案,一般有如下三种
- 立即返回:pool能取到,返回成功;取不到,返回失败;
- 死等:一直等,等到取到了pool相关数据,才返回;
- timeout:等一个timeout,如果timeout之内取到,那么就返回成功;否则,超时返回错误。
说来说去,似乎回归本源,就是当年最基本的并发控制——信号量(semaphore)
就实现来说,比较通用的控制方案,一般是令牌桶
。
并发控制,难点
取不到,等
不管是
死等
还是timeout
的情况,取不到都需要block在那;
唤醒
不管是有token可以取还是timeout,都需要唤醒block在那的任务。
基本方案
基本方案,即用semaphore(cond+mutex--->block) + timer(定时器)组合的解决方案
golang方案
chan(block)+timer(定时器)
有疑问加站长微信联系(非本文作者)