golang 并发实践
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 并发实践相关推荐
- 知乎社区核心业务 Golang 化实践
背景 众所周知,知乎社区后端的主力编程语言是 Python. 随着知乎用户的迅速增长和业务复杂度的持续增加,核心业务的流量在过去一年内增长了好几倍,对应的服务端的压力也越来越大.随着业务发展,我们发现 ...
- Golang 并发编程指南
分享 Golang 并发基础库,扩展以及三方库的一些常见问题.使用介绍和技巧,以及对一些并发库的选择和优化探讨. go 原生/扩展库 提倡的原则 不要通过共享内存进行通信;相反,通过通信来共享内存. ...
- Golang并发模型:合理退出并发协程
goroutine作为Golang并发的核心,我们不仅要关注它们的创建和管理,当然还要关注如何合理的退出这些协程,不(合理)退出不然可能会造成阻塞.panic.程序行为异常.数据结果不正确等问题.这篇 ...
- 【GoLang】golang 最佳实践汇总
最佳实践 1 包管理 1.1 使用包管理对Golang项目进行管理,如:godep/vendor等工具 1.2 main/init函数使用,init函数参考python 1.2.1 main-> ...
- Golang并发:再也不愁选channel还是选锁
周末又到了,为大家准备了一份实用干货:如何使用channel和Mutex解决并发问题,利用周末的好时光,配上音乐,思考一下吧?. 来,问自己个问题:面对并发问题,是用channel解决,还是用Mute ...
- Golang并发模型:轻松入门流水线FAN模式
前一篇文章<Golang并发模型:轻松入门流水线模型>,介绍了流水线模型的概念,这篇文章是流水线模型进阶,介绍FAN-IN和FAN-OUT,FAN模式可以让我们的流水线模型更好的利用Gol ...
- 『每周译Go』Google:12 条 Golang 最佳实践
这是直接总结好的 12 条,详细的再继续往下看: 先处理错误避免嵌套 尽量避免重复 先写最重要的代码 给代码写文档注释 命名尽可能简洁 使用多文件包 使用 go get 可获取你的包 了解自己的需求 ...
- Golang TDD实践报告:快速排序Quick Sort
Golang TDD实践报告:快速排序Quick Sort [阅读时间:约5分钟] 0.项目需求 1.编写符合项目输入输出的一个测试 2.尝试运行测试 3.先使用最少的代码来让失败的测试先跑起来 4. ...
- 京东抢购服务高并发实践
为什么80%的码农都做不了架构师?>>> 服务介绍 限时抢购又称闪购,英文Flash sale,起源于法国网站Vente Privée.闪购模式即是以互联网为媒介的B2C电子零售交易 ...
最新文章
- 2022-2028年中国科学仪器行业研究及前瞻分析报告
- ECCV2020 oral | 基于语义流的快速而准确的场景解析
- 介绍什么是极限编程?
- 如何用Python实现八大排序算法
- mysql 下 计算 两点 经纬度 之间的距离 计算结果排序
- oracle tabe unlock_Oracle 学习之性能优化(四)收集统计信息
- MaxCompute安全管理指南-基础篇
- centeros7安装mysql - 风中追风_lonely - 博客园
- tableau使用_使用Tableau升级Kaplan-Meier曲线
- 哪里学php开发,哪里学web开发
- 深入了解epoll 函数
- acl自然语言处理_ACL 2020中自然语言处理中的知识图
- maven打包常用命令总结
- [哈希/字典树/kmp]Exercise Week15 A~C
- sikuli实现百度云批量离线下载
- edge打开pdf不显示印章_win10 Edge浏览器打不开pdf文件的解决方法
- 水浒108将(按出场顺序)
- 方正浩:智能制造和工业互联网的投资新视角
- 不就是语法和长难句吗-思维导图分享
- 抖音的奇幻漂流:为什么TikTok让用户如此着迷?