我正在使用簡單的線程池加載網(wǎng)頁,同時(shí)從文件動(dòng)態(tài)加載 url。但是這個(gè)小程序會(huì)慢慢分配與我的服務(wù)器一樣多的內(nèi)存,直到 omm 殺手停止它。看起來 resp.Body.Close() 不會(huì)為正文文本釋放內(nèi)存(內(nèi)存大小 ~ 下載的頁面 * 平均頁面大?。H绾螐?qiáng)制 golang 釋放為正文 html 文本分配的內(nèi)存?package mainimport ( "bufio" "fmt" "io/ioutil" "net/http" "os" "strings" "sync")func worker(linkChan chan string, wg *sync.WaitGroup) { defer wg.Done() for url := range linkChan { // Getting body text resp, err := http.Get(url) if err != nil { fmt.Printf("Fail url: %s\n", url) continue } body, err := ioutil.ReadAll(resp.Body) resp.Body.Close() if err != nil { fmt.Printf("Fail url: %s\n", url) continue } // Test page body has_rem_code := strings.Contains(string(body), "googleadservices.com/pagead/conversion.js") fmt.Printf("Done url: %s\t%t\n", url, has_rem_code) }}func main() { // Creating worker pool lCh := make(chan string, 30) wg := new(sync.WaitGroup) for i := 0; i < 30; i++ { wg.Add(1) go worker(lCh, wg) } // Opening file with urls file, err := os.Open("./tmp/new.csv") defer file.Close() if err != nil { panic(err) } reader := bufio.NewReader(file) // Processing urls for href, _, err := reader.ReadLine(); err == nil; href, _, err = reader.ReadLine() { lCh <- string(href) } close(lCh) wg.Wait()}這是 pprof 工具的一些輸出: flat flat% sum% cum cum% 34.63MB 29.39% 29.39% 34.63MB 29.39% bufio.NewReaderSize 30MB 25.46% 54.84% 30MB 25.46% net/http.(*Transport).getIdleConnCh 23.09MB 19.59% 74.44% 23.09MB 19.59% bufio.NewWriter 11.63MB 9.87% 84.30% 11.63MB 9.87% net/http.(*Transport).putIdleConn 6.50MB 5.52% 89.82% 6.50MB 5.52% main.main看起來像這個(gè)問題,但它是在 2 年前修復(fù)的。
- 1 回答
- 0 關(guān)注
- 220 瀏覽
添加回答
舉報(bào)
0/150
提交
取消