parallel

knull666 · · 855 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

[TOC]

并发说明

并发,优雅的并发,一般都会用到pool的概念——比如,mysql、redis连接池;比如java/C/C++有线程池,golang有goroutine池;等等。
pool的目的,一是为了cach提高速度;其次就是上限控制——如果无上限的话,就没有必要用pool了。
pool的上限控制,即达到上限之后的处理方案,一般有如下三种

  • 立即返回:pool能取到,返回成功;取不到,返回失败;
  • 死等:一直等,等到取到了pool相关数据,才返回;
  • timeout:等一个timeout,如果timeout之内取到,那么就返回成功;否则,超时返回错误。

说来说去,似乎回归本源,就是当年最基本的并发控制——信号量(semaphore)
就实现来说,比较通用的控制方案,一般是令牌桶

test

并发控制,难点

取不到,等

不管是死等还是timeout的情况,取不到都需要block在那;

唤醒

不管是有token可以取还是timeout,都需要唤醒block在那的任务。

基本方案

基本方案,即用semaphore(cond+mutex--->block) + timer(定时器)组合的解决方案

golang方案

chan(block)+timer(定时器)


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:knull666

查看原文:parallel

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

855 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传