【发布时间】:2017-07-01 22:19:11
【问题描述】:
我正在尝试理解并发和 goroutine,并且对以下实验代码有几个问题:
- 为什么会造成内存泄漏?我认为 goroutine 结束时的 return 将允许与其关联的内存被清理。
- 为什么我的循环数几乎从未达到 999?事实上,当我输出到文件并研究输出时,我注意到它很少以两位数打印整数;它第一次打印“99”是第 2461 行,而“999”是第 6120 行。这种行为对我来说是出乎意料的,这显然意味着我并不真正了解 goroutine 调度发生了什么。
免责声明:
小心运行下面的代码,如果几秒钟后不停止它可能会导致系统崩溃!
代码
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
for {
// spawn four worker goroutines
spawnWorkers(4, wg)
// wait for the workers to finish
wg.Wait()
}
}
func spawnWorkers(max int, wg sync.WaitGroup) {
for n := 0; n < max; n++ {
wg.Add(1)
go func() {
defer wg.Done()
f(n)
return
}()
}
}
func f(n int) {
for i := 0; i < 1000; i++ {
fmt.Println(n, ":", i)
}
}
【问题讨论】:
-
你在复制
sync.WaitGroup;而是传递一个指向它的指针。 -
运行
go vet会显示错误。 -
嗨@TimCooper,关于内存泄漏,你是对的!这确实解决了问题 #1,但在那种情况下,goroutine 4 运行得比其他的多得多;输出到 .txt 文件时,我可以看到 #1 第一次运行是第 1640001 行。这对我来说没有多大意义。
-
@dpog 你对
n的输出不是你所期望的。见:github.com/golang/go/wiki/…
标签: go memory-leaks concurrency