parallel
knull666 · · 1625 次点击 · · 开始浏览[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(定时器)
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
[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(定时器)