In Go, goroutines are cheap to create and efficient to schedule. The Go runtime has been written for programs with tens of thousands of goroutines as the norm, hundreds of thousands are not unexpected. But goroutines do have a finite cost in terms of memory footprint; you cannot create an infinite number of them.
Every time you use the go
keyword in your program to launch a goroutine, you must know how, and when, that goroutine will exit. If you don’t know the answer, that’s a potential memory leak.
Consider this trivial code snippet:
ch := somefunction() go func() { for range ch { } }()
This code obtains a channel of int
from somefunction
and starts a goroutine to drain it. When will this goroutine exit? It will only exit when ch
is closed. When will that occur? It’s hard to say, ch
is returned by somefunction.
So, depending on the state of somefunction,
ch
might never be closed, causing the goroutine to quietly leak.
In your design, some goroutines may run until the program exits, for example a background goroutine watching a configuration file, or the main conn.Accept
loop in your server. However, these goroutines are rare enough I don’t consider them an exception to this rule.
Every time you write the statement go
in a program, you should consider the question of how, and under what conditions, the goroutine you are about to start, will end.
有疑问加站长微信联系(非本文作者)