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

标签 go goroutine

我正在学习 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/

相关文章:

json - 遍历 JSON 键和值并同时替换 golang 中的指定匹配值

Golang 依赖项在 init() 中注册 sql 驱动程序导致冲突

Go:嵌入类型在派生类型中的字段初始化

go - golang channel 收不到

java - Go 和 Java 使用用户空间线程这一事实是否意味着您不能真正利用多核?

algorithm - 并行打印多行 Golang

pointers - 如何在Go中通过指针接收器方法修改简单类型的值?

arrays - 如何在 golang 中编写具有嵌套递归数据的结构

multithreading - 即使例程在 Golang 中发生了 "keep main thread running",如何返回 "runtime error"?

go - 如何停止/完成 goroutine