全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何利用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  # 高并发  # 高并发架构  # 高并发实例  # golang高并发之本地缓存详解  # Golang使用Channel组建高并发HTTP服务器  # golang使用map支持高并发的方法(1000万次操作14ms)  # golang高并发系统限流策略漏桶和令牌桶算法源码剖析  # 关于golang高并发的实现与注意事项说明  # 基于Golang 高并发问题的解决方案  # golang高并发限流操作 ping / telnet  # golang-gin-mgo高并发服务器搭建教程  # golang高并发的深入理解  # 浅谈Go语言高并发处理思路  # 自己的  # 在此  # 似懂非懂  # 一遍  # 看完  # 技术人员  # 写了  # 这几天  # 这篇文章  # 谢谢大家  # 每分钟  # 如何处理  # 头条  # 一篇文章  # 进行了  # 有错误  # 是否正确  # 池中  # 主要是  # 后端 


相关文章: 深圳防火门网站制作公司,深圳中天明防火门怎么编码?  简单实现Android文件上传  制作农业网站的软件,比较好的农业网站推荐一下?  微信推文制作网站有哪些,怎么做微信推文,急?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  魔方云NAT建站如何实现端口转发?  如何在万网开始建站?分步指南解析  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  建站之星备案是否影响网站上线时间?  建站之星后台密码如何安全设置与找回?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  已有域名如何免费搭建网站?  如何挑选高效建站主机与优质域名?  公司网站的制作公司,企业网站制作基本流程有哪些?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  营销式网站制作方案,销售哪个网站招聘效果最好?  如何正确选择百度移动适配建站域名?  建站之星导航菜单设置与功能模块配置全攻略  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  网站制作软件有哪些,制图软件有哪些?  如何注册花生壳免费域名并搭建个人网站?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  高端建站三要素:定制模板、企业官网与响应式设计优化  网站制作难吗安全吗,做一个网站需要多久时间?  建站之星如何助力网站排名飙升?揭秘高效技巧  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  浅析上传头像示例及其注意事项  如何在阿里云高效完成企业建站全流程?  太原网站制作公司有哪些,网约车营运证查询官网?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  如何在阿里云虚拟服务器快速搭建网站?  建站主机选购指南:核心配置优化与品牌推荐方案  建站之星×万网:智能建站系统+自助建站平台一键生成  ui设计制作网站有哪些,手机UI设计网址吗?  宁波免费建站如何选择可靠模板与平台?  北京的网站制作公司有哪些,哪个视频网站最好?  如何在香港服务器上快速搭建免备案网站?  威客平台建站流程解析:高效搭建教程与设计优化方案  如何在建站主机中优化服务器配置?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  微信h5制作网站有哪些,免费微信H5页面制作工具?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  哈尔滨网站建设策划,哈尔滨电工证查询网站?  如何选择高效响应式自助建站源码系统? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。