gpt4 book ai didi

go - ioutil.ReadAll 导致 goroutine 泄漏

转载 作者:IT王子 更新时间:2023-10-29 01:49:58 25 4
gpt4 key购买 nike

即使我关闭了 resp.body,为什么我在终止前有多个 goroutine,而我只使用了阻塞调用?如果我不使用 resp.Body,它只会以一个 goroutine 终止。

package main

import (
"fmt"
"io/ioutil"
"net/http"
"runtime"
"time"
)

func fetch() {
client := http.Client{Timeout: time.Second * 10}
url := "http://example.com"
req, err := http.NewRequest("POST", url, nil)
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
_, err = ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
}

func main() {
fmt.Println("#Goroutines:", runtime.NumGoroutine())
fetch()
// runtime.GC()
time.Sleep(time.Second * 5)
fmt.Println("#Goroutines:", runtime.NumGoroutine())
}

输出:

#Goroutines: 1
#Goroutines: 3

最佳答案

默认的 http 传输 maintains a connection pool .

DefaultTransport is the default implementation of Transport and is used by DefaultClient. It establishes network connections as needed and caches them for reuse by subsequent calls.

每个连接都由至少一个 goroutine 管理。但这不是泄漏,您只是不耐烦。如果你等待的时间足够长,你会看到连接最终关闭并且 goroutine 消失了。默认空闲超时为 90 秒。

如果你想尽快关闭连接,设置http.Request.Close中的一个或 http.Transport.DisableKeepAlives为真。

关于go - ioutil.ReadAll 导致 goroutine 泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49676747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com