需要向
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 不适合这份工作吗?