在 goroutine 中用于 POST 请求的 net/http 和 fasthttp 无法区分经过时间

问题描述 投票:0回答:0

需要向

n
服务器发送多个post请求,并收集响应。

我通过go-routine分别实现了

net/http
fasthttp
版本。但不确定这是最佳方式。

fasthttp(在 git 中)说它比 net/http 快 10 倍,但我发现它在经过的时间上没有太大差异。

net/http版本

func get_from_net_http(query []float32, serverSize int, wg *sync.WaitGroup, client *http.Client) {
    wg.Add(serverSize)   // assume the size is 4

    defer timeTrack(time.Now(), "get_from_net_http")
    res_chan := make(chan Response, 4)

    total_res := []ResPair{}

    for i := 0; i < serverSize; i++ {
        go func(server_idx int) {
            defer wg.Done()
            msg := get_message(server_idx, query)
            target_url := get_target_url(server_idx)   // "http://server-index-%d:8000/"
            pbytes, _ := json.Marshal(msg)
            buff := bytes.NewBuffer(pbytes)
            resp, err := client.Post(target_url, "application/json", buff)
            if err != nil {
                panic(err)
            }
            defer resp.Body.Close()

            reqBody, err := io.ReadAll(resp.Body)
            if err != nil {
                panic(err)
            }
            var res Response
            json.Unmarshal(reqBody, &res)
            res_chan <- res
        }(i)
    }
    go func() {
        wg.Wait()
        close(res_chan)
    }()

    for r := range res_chan {
        total_res = append(total_res, r.Result...)
    }
}

fasthttp 版本

func get_from_fasthttp(query []float32, serverSize int, wg *sync.WaitGroup) {
    wg.Add(serverSize)
    res_chan := make(chan Response, 4)
    total_res := []ResPair{}
    defer timeTrack(time.Now(), "get_from_fasthttp")

    for i := 0; i < serverSize; i++ {
        go func(server_idx int) {
            msg := get_message(server_idx, query)
            pbytes, _ := json.Marshal(msg)
            url := get_target_url(server_idx)

            req := fasthttp.AcquireRequest()
            resp := fasthttp.AcquireResponse()
            defer func() {
                fasthttp.ReleaseRequest(req)
                fasthttp.ReleaseResponse(resp)
                wg.Done()
            }()
            req.Header.SetMethod("POST")
            req.Header.SetContentType("application/json")
            req.SetBody(pbytes)
            req.SetRequestURI(url)

            reqTimeout := time.Duration(30) * time.Millisecond
            err := fasthttp.DoTimeout(req, resp, reqTimeout)

            if err != nil {
                panic(err)
            }

            bodyBytes := resp.Body()
            var res Response
            json.Unmarshal(bodyBytes, &res)

            res_chan <- res
        }(i)
    }

    go func() {
        wg.Wait()
        close(res_chan)
    }()

    for r := range res_chan {
        total_res = append(total_res, r.Result...)
    }
}

我错过了什么吗?或者 fasthttp 不适合这份工作吗?

go post goroutine fasthttp
© www.soinside.com 2019 - 2024. All rights reserved.