Goroutines与http.HandleFunc

时间:2014-04-10 14:43:40

标签: go

我想知道代码1是否管理内部例程,并且当requets增加(几十个)时可以使用一个CPU的所有内核,或者如果每个处理程序我必须放置关键字go,表明函数处理程序将由一个gorotine管理,如在代码2中显示它,因此可以使用服务器的所有核心。

代码1

package main

import (
    "fmt"
    "net/http"
)

func HandlerOne(w http.ResponseWriter, req *http.Request) {
    fmt.Println("message one")
}

func HandlerTwo(w http.ResponseWriter, req *http.Request) {
    fmt.Println("message two")
}
func main() {

        http.HandleFunc("/R1", HandlerOne)
        http.HandleFunc("/R2", HandlerTwo)

        err := http.ListenAndServe(":9998", nil)

    if err != nil {
        fmt.Printf("Server failed: ", err.Error())
    }
}

代码2

    package main

    import (
        "fmt"
        "net/http"
    )

    func HandlerOne(w http.ResponseWriter, req *http.Request) {
        fmt.Println("message one")
    }

    func HandlerTwo(w http.ResponseWriter, req *http.Request) {
        fmt.Println("message two")
    }
    func main() {

        go http.HandleFunc("/R1", HandlerOne)
        go http.HandleFunc("/R2", HandlerTwo)

        err := http.ListenAndServe(":9998", nil)

        if err != nil {
            fmt.Printf("Server failed: ", err.Error())
        }
    }

注意:两者都运行没有问题,您可以使用

进行测试
curl -l http://localhost:9998/R1

curl -l http://localhost:9998/R2

1 个答案:

答案 0 :(得分:1)

版本2错了。包http会为您处理所有这些内容。 只需确保使用适当的GOMAXPROCS调用您的程序,例如比如GOMAXPROCS=4 ./main