【发布时间】:2018-07-09 16:52:53
【问题描述】:
我试图了解默认情况下选择块中关闭通道的行为,但对以下输出感到困惑。 这里调用了 50 个 goroutine 并关闭了完成通道。
func testClosedChannelBehavior() {
const n = 50
finish := make(chan bool)
var done sync.WaitGroup
for i := 0; i < n; i++ {
done.Add(1)
go func(x int) {
select {
case <-time.After(1 * time.Hour):
case <-finish:
fmt.Printf("received finish %d\n", x)
default:
fmt.Printf("I didnt wait %d\n", x)
}
done.Done()
}(i)
}
t0 := time.Now()
close(finish)
fmt.Println("finish closed")
done.Wait()
fmt.Printf("Waited %v for %d goroutines to stop\n", time.Since(t0), n)
}
我预计一旦任何 goroutine 打印“received finish”,默认情况不应被任何其他 goroutine 执行,即“我没有等待”不应该被打印。
但输出不一致。有时它的行为符合预期,但在多次运行时,我会看到如下意外输出:
=====output======
I didnt wait 0
received finish 7
finish closed
received finish 13
received finish 10
received finish 32
received finish 5
received finish 14
received finish 33
received finish 42
received finish 11
received finish 4
received finish 23
received finish 44
received finish 49
received finish 15
received finish 24
received finish 31
received finish 16
received finish 40
received finish 41
received finish 6
received finish 26
I didnt wait 1
received finish 19
received finish 8
received finish 43
received finish 29
received finish 20
received finish 46
received finish 12
received finish 36
received finish 47
received finish 37
received finish 35
received finish 30
received finish 39
received finish 22
received finish 28
I didnt wait 2
received finish 17
received finish 45
I didnt wait 9
received finish 48
received finish 34
I didnt wait 3
received finish 25
received finish 38
received finish 27
received finish 18
received finish 21
Waited 394.999µs for 50 goroutines to stop
我正在经历 this link 期望 close(finish) 会向其他人发出信号,那些仍在等待的人,表现得一样。
【问题讨论】:
标签: go