加入收藏 | 设为首页 | 会员中心 | 我要投稿 莆田站长网 (https://www.0594zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

使用Go处理每分钟百万请求

发布时间:2019-07-03 02:29:40 所属栏目:优化 来源:MarcioCastilho
导读:副标题#e# 这篇文章在medium上很火,作者以实际案例来分析,讲得很好。 我们经常听说使用Go的goroutine和channel很容易实现高并发,那是不是全部代码都放在goroutine中运行就可以实现高并发程序了呢?很显然并不是。这篇文章将教大家如何一步一步写出一个简

在我们的Web服务器初始化期间,我们创建一个Dispatcher并调用Run()来创建worker池并开始监听JobQueue中出现的Job。

  1. dispatcher := NewDispatcher(MaxWorker)  
  2. dispatcher.Run() 

以下是我们调度程序实现的代码:

  1. type Dispatcher struct { 
  2.     // A pool of workers channels that are registered with the dispatcher 
  3.     WorkerPool chan chan Job 
  4.  
  5. func NewDispatcher(maxWorkers int) *Dispatcher { 
  6.     pool := make(chan chan Job, maxWorkers) 
  7.     return &Dispatcher{WorkerPool: pool} 
  8.  
  9. func (d *Dispatcher) Run() { 
  10.     // starting n number of workers 
  11.     for i := 0; i < d.maxWorkers; i++ { 
  12.         worker := NewWorker(d.pool) 
  13.         worker.Start() 
  14.     } 
  15.  
  16.     go d.dispatch() 
  17.  
  18. func (d *Dispatcher) dispatch() { 
  19.     for { 
  20.         select { 
  21.         case job := <-JobQueue: 
  22.             // a job request has been received 
  23.             go func(job Job) { 
  24.                 // try to obtain a worker job channel that is available. 
  25.                 // this will block until a worker is idle 
  26.                 jobChannel := <-d.WorkerPool 
  27.  
  28.                 // dispatch the job to the worker job channel 
  29.                 jobChannel <- job 
  30.             }(job) 
  31.         } 
  32.     } 

(编辑:莆田站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读