Golang http服务器实现
问题描述:
我读过net/http为每个连接启动一个go子例程。我有几个问题。但我还没有看到任何参数来限制衍生的新的子程序的数量。例如,如果我必须每秒处理100万个并发请求,会发生什么情况?我们是否对生成的子程序有任何控制权?如果它每个连接产生一个子程序,它会不会窒息我的整个系统?处理go webserver的大量并发请求的推荐方式是什么?我必须处理两种异步和同步响应。Golang http服务器实现
答
作业/工作者模式是一种非常常见的并发模式,适用于此任务。
多个例程可以从单个通道读取,在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/
[为细末Web服务器流程管理(可能的重复http://stackoverflow.com/questions/37529511/流程管理 - 为这去,web服务器) – icza