hello world

stay foolish, stay hungry

开启goroutine前确保goroutine可以退出

golang 可以通过 goroutine 来实现高并发,并且创建 goroutine 的开销很小,可以很轻松的创建成千上万的 goroutine。但有个问题需要注意,在创建 goroutine 之前,必须要清楚创建的 goroutine 将如何退出,否则 goroutine 将常驻内存,可能会导致内存泄漏等问题。

程序 1 展示了因为 goroutine 导致内存泄漏的 demo。leak 函数中,创建一个channel,并启动一个goroutine 来消费这个channel。这个 goroutine 结束的唯一条件是关闭 ch。但是 leak 函数返回之后,ch 没有被关闭,这样 goroutine 会一直在内存中,随着 leak 函数调用次数的增多,占用内存也随着增长,最终导致内存泄漏。

// 程序 1
func leak() {
    ch := make(chan int)
    go func() {
        for range ch { }
    }()    
}

所以在使用 go 关键词开启 goroutine 之前,必须要清楚 goroutine 的退出条件。

参考资料

  1. https://dave.cheney.net/2016/12/22/never-start-a-goroutine-without-knowing-how-it-will-stop