如何利用Golang写出高并发代码详解
2019/7/10 22:08:35
本文主要是介绍如何利用Golang写出高并发代码详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
之前一直对Golang如何处理高并发http请求的一头雾水,这几天也查了很多相关博客,似懂非懂,不知道具体代码怎么写
下午偶然在开发者头条APP上看到一篇国外技术人员的一篇文章用Golang处理每分钟百万级请求,看完文章中的代码,自己写了一遍代码,下面自己写下自己的体会
核心要点
将请求放入队列,通过一定数量(例如CPU核心数)goroutine组成一个worker池(pool),workder池中的worker读取队列执行任务
实例代码
以下代码笔者根据自己的理解进行了简化,主要是表达出个人的思路,实际后端开发中,根据实际场景修改
func doTask() { //耗时炒作(模拟) time.Sleep(200 * time.Millisecond) wg.Done() } //这里模拟的http接口,每次请求抽象为一个job func handle() { //wg.Add(1) job := Job{} JobQueue <- job } var ( MaxWorker = 1000 MaxQueue = 200000 wg sync.WaitGroup ) 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 stop return } } }() } // Stop signals the worker to stop listening for work requests. func (w Worker) Stop() { go func() { w.quit <- true }() } type Job struct { } var JobQueue chan Job = make(chan Job, MaxQueue) type Dispatcher struct { } func NewDispatcher() *Dispatcher { return &Dispatcher{} } func (d *Dispatcher) Run() { // starting n number of workers for 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() }
测试结果
pkg: golang-study-demo/goroutine 1 2029931652 ns/op PASS
1w个任务放到队列中,1000个worker去执行任务,每个任务的耗时200ms,任务执行完需要2s多
以上只是笔者的个人看法,不知道对Golang并发编程的理解是否正确,有错误的地方,希望高手指点一二,在此谢过
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对找一找教程网的支持。
这篇关于如何利用Golang写出高并发代码详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-09-26通过 gcloud CLI 认证从本地脚本写入 Google Sheets
- 2024-09-24GoLand 新建项目 Enable vendoring support automatically 的作用是什么?-icode9专业技术文章分享
- 2024-09-21MongoDB资料:新手入门与初级应用指南
- 2024-09-20MongoDB教程:初学者必备指南
- 2024-09-05MongoDB入门:快速掌握NoSQL数据库基础
- 2024-08-28go 项目中怎么打印调试-icode9专业技术文章分享
- 2024-08-21swoole未来的发展前景与golang对比哪个更好-icode9专业技术文章分享
- 2024-08-16goland 已经下了中文插件了, 怎么设置成中文-icode9专业技术文章分享
- 2024-07-26使用 SendGrid 的 Go 客户端库能同时给多个邮箱发吗-icode9专业技术文章分享
- 2024-07-26使用 SendGrid 的 Go 客户端库时怎么设置header 和 标签tag 呢-icode9专业技术文章分享