请问怎样限制http server的goroutine个数

就最简单的http server

func test(w http.ResponseWriter, r *http.Request){
    fmt.Fprintln(w, "hello world")
}
func main(){
    http.HandleFunc("/", test)
    err := http.ListenAndServe(":12345", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

我知道客户端访问服务器的时候,就会建立一个goroutine来执行test函数,有没有办法限制启动goroutine的个数?最好是有池一样的东西,启动固定数量的goroutine,一个执行完马上新的填进去,普通的工作池我知道怎么实现,这个http server的能搞吗? 还是http server不需要工作池?

共 2 个回复


donghao

写了一个简单的利用 channel 来实现限制 goroutine 数目的。

package main

import (
    "fmt"
    "net/http"
    "time"
)

type Limit chan int

func (s Limit) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    select {
    case s <- 1:
        fmt.Fprintln(w, "hello,welcome")
        time.Sleep(10 * time.Second)
        <-s
    case <-time.After(1 * time.Second):
        fmt.Fprintln(w, "timeout, byebye.")
    }
}

func main() {
    var s Limit = make(chan int, 1)
    http.Handle("/", s)
    http.ListenAndServe(":4004", nil)
}
# 1