Golang http服务器实现

时间:2016-06-08 07:32:20

标签: http go concurrency

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

1 个答案:

答案 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/