加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.cn/)- 云渲染、网络安全、数据安全、数据分析、人体识别!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

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

发布时间:2019-07-03 02:11:43 所属栏目:优化 来源:MarcioCastilho
导读:这篇文章在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.  
  6. func NewDispatcher(maxWorkers int) *Dispatcher { 
  7.     pool := make(chan chan Job, maxWorkers) 
  8.     return &Dispatcher{WorkerPool: pool} 
  9. } 
  10.  
  11. func (d *Dispatcher) Run() { 
  12.     // starting n number of workers 
  13.     for i := 0; i < d.maxWorkers; i++ { 
  14.         worker := NewWorker(d.pool) 
  15.         worker.Start() 
  16.     } 
  17.  
  18.     go d.dispatch() 
  19. } 
  20.  
  21. func (d *Dispatcher) dispatch() { 
  22.     for { 
  23.         select { 
  24.         case job := <-JobQueue: 
  25.             // a job request has been received 
  26.             go func(job Job) { 
  27.                 // try to obtain a worker job channel that is available. 
  28.                 // this will block until a worker is idle 
  29.                 jobChannel := <-d.WorkerPool 
  30.  
  31.                 // dispatch the job to the worker job channel 
  32.                 jobChannel <- job 
  33.             }(job) 
  34.         } 
  35.     } 
  36. } 

(编辑:常州站长网)

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

热点阅读