我已经读过net / http为每个连接启动一个go子例程。我几乎没有问题。但我没有看到任何参数来限制衍生的新的子子程序的数量。例如,如果我每秒必须处理100万个并发请求,会发生什么?我们对衍生的子子程序有任何控制吗?如果它为每个连接产生一个go子程序,它不会扼杀我的整个系统吗?处理go webserver的大量并发请求的推荐方法是什么?我必须处理异步和同步响应的两种情况。
答案 0 :(得分:1)
作业/工作者模式是适合此任务的常见的并发模式。
多个goroutine可以从单个通道读取,在CPU核心之间分配大量工作,因此工作者名称。在Go中,这种模式很容易实现 - 只需启动一些带有channel作为参数的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并行运行,等待频道给他们工作。 goroutines几乎立即接受他们的工作。
这是一篇很棒的文章,介绍了如何在go中处理每分钟100万个请求:http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/