请教下老师,和其他各位大佬

来源:15-2 正则表达式

会飞的wade

2019-05-27

在使用http库创建web服务器,下面这段代码,加协程处理 go proccess(w) 有什么不同。这样能提高并发吗,不加协程处理,是不是这个web服务,同时就只能处理一个请求呢?其他的框架,比如gin,他们的原理也是在这里加go协程处理提高并发吗?

import (
    "log"
    "net/http"
    "io"
)

func proccess(w http.ResponseWriter) {
    resp, err := http.Get("https://baidu.com/")
    if err != nil {
        log.Print(err)
    }
    defer resp.Body.Close()

    for name, values := range resp.Header {
        w.Header()[name] = values
    }

    io.Copy(w, resp.Body)

}

func Handler(w http.ResponseWriter, r *http.Request) {
    proccess(w)
    //go proccess(w) //这里加 go 协程处理就能提高我这个WEB服务并发吗
}

func main() {

    http.HandleFunc("/", Handler)
    log.Fatal(http.ListenAndServe(":8866", nil))
}
写回答

1回答

ccmouse

2019-05-27

不加goroutine也不会一个时刻只能一个请求的。handler是会在另外的goroutine里调的,http库会帮你做这件事。当然也不是无脑的开goroutine,而是用了个叫multiplexer的东西。这里有一篇详细的分析:https://www.jianshu.com/p/be3d9cdc680b
gin的话,我们也可以用类似的方法进行分析。

0
1
会飞的wade
谢谢老师的解答,那我这里加goroutine是不是就是多余的,没啥用,反而增加系统开销负担呢
2019-05-28
共1条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程