golang 高并发主要是依靠sync包下的api实现,首先就是WaitGroup:
先说说WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。
WaitGroup总共有三个方法:Add(delta int),Done(),Wait()。简单的说一下这三个方法的作用。
Add:添加或者减少等待goroutine的数量
Done:相当于Add(-1)
Wait:执行阻塞,直到所有的WaitGroup数量变成0

代码:

type Worker struct {quit chan bool
}func NewWorker() Worker {return Worker{quit: make(chan bool)}
}// Start method starts the run loop for the worker, listening for a quit channel in
// case we need to stop it
func (w Worker) Start() {go func() {for {select {case <-JobQueue:// we have received a work request.doTask()case <-w.quit:// we have received a signal to stopreturn}}}()
}// Stop signals the worker to stop listening for work requests.
func (w Worker) Stop() {go func() {w.quit <- true}()
}

Job类:

type Job struct {
}var JobQueue chan Job = make(chan Job, MaxQueue)func doTask() {//耗时炒作(模拟)time.Sleep(200 * time.Millisecond)wg.Done()
}//这里模拟的http接口,每次请求抽象为一个job
func handle() {//wg.Add(1)job := Job{}JobQueue <- job
}var (MaxWorker = 1000MaxQueue  = 200000wg        sync.WaitGroup
)

Dispatcher 类:

type Dispatcher struct {
}func NewDispatcher() *Dispatcher {return &Dispatcher{}
}func (d *Dispatcher) Run() {// starting n number of workersfor i := 0; i < MaxWorker; i++ {worker := NewWorker()worker.Start()}
}

测试执行代码:

func Benchmark_handle(b *testing.B)  {runtime.GOMAXPROCS(runtime.NumCPU())d := NewDispatcher()d.Run()for i:=0;i<10000;i++ {wg.Add(1)handle()}wg.Wait()
}

golang 并发实践相关推荐

  1. 知乎社区核心业务 Golang 化实践

    背景 众所周知,知乎社区后端的主力编程语言是 Python. 随着知乎用户的迅速增长和业务复杂度的持续增加,核心业务的流量在过去一年内增长了好几倍,对应的服务端的压力也越来越大.随着业务发展,我们发现 ...

  2. ​Golang 并发编程指南

    分享 Golang 并发基础库,扩展以及三方库的一些常见问题.使用介绍和技巧,以及对一些并发库的选择和优化探讨. go 原生/扩展库 提倡的原则 不要通过共享内存进行通信;相反,通过通信来共享内存. ...

  3. Golang并发模型:合理退出并发协程

    goroutine作为Golang并发的核心,我们不仅要关注它们的创建和管理,当然还要关注如何合理的退出这些协程,不(合理)退出不然可能会造成阻塞.panic.程序行为异常.数据结果不正确等问题.这篇 ...

  4. 【GoLang】golang 最佳实践汇总

    最佳实践 1 包管理 1.1 使用包管理对Golang项目进行管理,如:godep/vendor等工具 1.2 main/init函数使用,init函数参考python 1.2.1 main-> ...

  5. Golang并发:再也不愁选channel还是选锁

    周末又到了,为大家准备了一份实用干货:如何使用channel和Mutex解决并发问题,利用周末的好时光,配上音乐,思考一下吧?. 来,问自己个问题:面对并发问题,是用channel解决,还是用Mute ...

  6. Golang并发模型:轻松入门流水线FAN模式

    前一篇文章<Golang并发模型:轻松入门流水线模型>,介绍了流水线模型的概念,这篇文章是流水线模型进阶,介绍FAN-IN和FAN-OUT,FAN模式可以让我们的流水线模型更好的利用Gol ...

  7. 『每周译Go』Google:12 条 Golang 最佳实践

    这是直接总结好的 12 条,详细的再继续往下看: 先处理错误避免嵌套 尽量避免重复 先写最重要的代码 给代码写文档注释 命名尽可能简洁 使用多文件包 使用 go get 可获取你的包 了解自己的需求 ...

  8. Golang TDD实践报告:快速排序Quick Sort

    Golang TDD实践报告:快速排序Quick Sort [阅读时间:约5分钟] 0.项目需求 1.编写符合项目输入输出的一个测试 2.尝试运行测试 3.先使用最少的代码来让失败的测试先跑起来 4. ...

  9. 京东抢购服务高并发实践

    为什么80%的码农都做不了架构师?>>> 服务介绍 限时抢购又称闪购,英文Flash sale,起源于法国网站Vente Privée.闪购模式即是以互联网为媒介的B2C电子零售交易 ...

最新文章

  1. 2022-2028年中国科学仪器行业研究及前瞻分析报告
  2. ECCV2020 oral | 基于语义流的快速而准确的场景解析
  3. 介绍什么是极限编程?
  4. 如何用Python实现八大排序算法
  5. mysql 下 计算 两点 经纬度 之间的距离 计算结果排序
  6. oracle tabe unlock_Oracle 学习之性能优化(四)收集统计信息
  7. MaxCompute安全管理指南-基础篇
  8. centeros7安装mysql - 风中追风_lonely - 博客园
  9. tableau使用_使用Tableau升级Kaplan-Meier曲线
  10. 哪里学php开发,哪里学web开发
  11. 深入了解epoll 函数
  12. acl自然语言处理_ACL 2020中自然语言处理中的知识图
  13. maven打包常用命令总结
  14. [哈希/字典树/kmp]Exercise Week15 A~C
  15. sikuli实现百度云批量离线下载
  16. edge打开pdf不显示印章_win10 Edge浏览器打不开pdf文件的解决方法
  17. 水浒108将(按出场顺序)
  18. 方正浩:智能制造和工业互联网的投资新视角
  19. 不就是语法和长难句吗-思维导图分享
  20. 抖音的奇幻漂流:为什么TikTok让用户如此着迷?

热门文章

  1. Kaggle竞赛方案分享:如何分辨杂草和植物幼苗(转)
  2. linux下面mysql不监听3306
  3. C++自定义直方图均衡化
  4. 深度学习(八)——fine-tuning, 李飞飞
  5. 清理c盘垃圾的cmd命令_用命令删除系统垃圾,这波操作深藏功与名
  6. 一篇文章彻底说清JS的深拷贝/浅拷贝
  7. 环球网-王坚《在线》:用20万字讲清楚三个词
  8. ElasticSearch---------------------step2,了解elasticsearch相关的基本概念
  9. Java面向对象练习题之字母输出
  10. Boost学习笔记-智能指针