jsem v Go novy a zkousim tento priklad
https://gobyexample.com/worker-poolsakorat jsem si tam zkusil dat net/http ze standardni knihovny a leakuje mi pamet silenym zpusobem
1)
zaviram resp.Body.Close()2)
taky se podivejte ze clienta a transport zkousim vytvorit mimo for loop presto to leakuje pamet jak blazen!
poradte prosim proc to leakuje
package main
import (
"fmt"
"net/http"
"time"
)
func check2(id int,jobs <- chan string,results chan <- string) (){
// nevytvarim pokazde transport ani klienta
tr := &http.Transport{DisableCompression:true, DisableKeepAlives:true}
myClient := &http.Client{
Transport: tr,
Timeout: time.Second * 10,
}
//--------------------------------------------------
for url := range jobs {
start := time.Now()
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return
}
req.Header.Set("User-Agent", "Leak test")
resp, err := myClient.Do(req)
if err != nil {
return
}
defer resp.Body.Close()
results <- fmt.Sprintf("X-goroutine_id %d => %s %s",id,url,time.Since(start))
time.Sleep(time.Millisecond*100) //wait before next iteration
}
}
func main() {
//go build -ldflags="-s -w" -o tt.exe leak2.go && tt.exe
var max = 5000
in := make(chan string, max)
out := make(chan string, max)
for i:=0;i<max;i++{
in <- "http://127.0.0.1:5000/"
}
close(in)
for i:=0;i<2;i++{
go check2(i+1,in,out)
}
for i:=0;i<max;i++{
fmt.Printf("%s\n", <-out)
}
}