gpt4 book ai didi

go - 在 goroutines 中启动 goroutines 是否可以接受?

转载 作者:IT老高 更新时间:2023-10-28 13:07:50 29 4
gpt4 key购买 nike

我正在学习 Go,我的第一个项目是一个简单的 ping 脚本。本质上,我想 ping 一堆 url,并在每个响应时等待 XXX 秒,然后再次 ping。这是删减的代码:

func main() {
// read our text file of urls
f, err := ioutil.ReadFile(urlFile)
if err != nil {
log.Print(err)
}

urlStrings := []string{}
urlStrings = strings.Split(string(f), "\n")

for _, v := range urlStrings {
go ping(v)
}

// output logs to the terminal
// channel is global
for i := range c {
fmt.Println(i)
}
}

func ping(url string) {
// for our lag timer
start := time.Now()

// make our request
_, err := http.Get(url)

if err != nil {
msg := url + " Error:" + err.Error()

fmt.Println(msg)

c <- msg
reportError(msg)
} else {
lag := time.Since(start)
var msg string

// running slow
if lag > lagThreshold*time.Second {
msg = url + " lag: " + lag.String()
reportError(msg)
}

msg = url + ", lag: " + lag.String()
c <- msg
}

time.Sleep(pingInterval * time.Second)
go ping(url) // is this acceptable?
}

在我的 Get 请求中,我之前调用了 defer res.Body.Close() ,但在应用程序运行一段时间后,这令人 panic 。我假设在 goroutine 被垃圾收集并且 res 不再存在之前,defer 无法在响应上调用 Close()。

这让我想到,如果在 goroutine 中调用 goroutine 是最佳实践,或者我是否会导致函数永远不会退出,那么只有在 goroutine 被垃圾回收后才会调用 defer。

最佳答案

没关系。从另一个 goroutine 调用一个 goroutine 是完全可以接受的。调用的 goroutine 仍然会退出,新的 goroutine 会继续愉快的进行。

关于go - 在 goroutines 中启动 goroutines 是否可以接受?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16288116/

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