2016-06-08 121 views
0

我读过net/http为每个连接启动一个go子例程。我有几个问题。但我还没有看到任何参数来限制衍生的新的子程序的数量。例如,如果我必须每秒处理100万个并发请求,会发生什么情况?我们是否对生成的子程序有任何控制权?如果它每个连接产生一个子程序,它会不会窒息我的整个系统?处理go webserver的大量并发请求的推荐方式是什么?我必须处理两种异步和同步响应。Golang http服务器实现

+1

[为细末Web服务器流程管理(可能的重复http://stackoverflow.com/questions/37529511/流程管理 - 为这去,web服务器) – icza

回答

1

作业/工作者模式是一种非常常见的并发模式,适用于此任务。

多个例程可以从单个通道读取,在CPU核心之间分配一定量的工作量,因此可以分配工人名称。在Go中,这种模式很容易实现 - 只需启动一些以通道为参数的goroutine,然后将值发送到该通道 - 分发和复用将由Go运行时完成。

package main 

import (
    "fmt" 
    "sync" 
    "time" 
) 

func worker(tasksCh <-chan int, wg *sync.WaitGroup) { 
    defer wg.Done() 
    for { 
     task, ok := <-tasksCh 
     if !ok { 
      return 
     } 
     d := time.Duration(task) * time.Millisecond 
     time.Sleep(d) 
     fmt.Println("processing task", task) 
    } 
} 

func pool(wg *sync.WaitGroup, workers, tasks int) { 
    tasksCh := make(chan int) 

    for i := 0; i < workers; i++ { 
     go worker(tasksCh, wg) 
    } 

    for i := 0; i < tasks; i++ { 
     tasksCh <- i 
    } 

    close(tasksCh) 
} 

func main() { 
    var wg sync.WaitGroup 
    wg.Add(36) 
    go pool(&wg, 36, 50) 
    wg.Wait() 
} 

所有goroutines并行运行,等待通道给他们工作。工作室几乎立即接受他们的工作。

这里是你如何处理每分钟1万个请求在走了一大篇:http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/