package main
import (
"time"
"runtime"
)
var c = make(chan int, 2)
func main() {
go worker(1)
for i := 0; i < 30; i++ {
go func() {
// k := i make a local copy not make any difference
c <- i
}()
}
time.Sleep(100* time.Second)
}
func worker(id int) {
for {
a := <-c
println(a, runtime.NumGoroutine())
time.Sleep(time.Second)
}
}
輸出是不可預知的,有時像下面那樣。golang緩衝區通道意外結果
7 9
13 29
13 28
13 27
13 26
13 25
13 24
13 23
16 22
16 21
17 20
19 19
21 18
21 17
23 16
25 15
26 14
26 13
26 12
26 11
26 10
26 9
26 8
26 7
27 6
27 5
13 4
28 3
30 2
30 2
我知道如果緩衝區通道已滿,發件人會阻塞,並且當通道可用時發件人可以繼續。
- 爲什麼輸出不是恆定輸出0-29?如何使它?
- 變量/局部變量如何在goroutine中存儲?
- 如果很多發送者被阻塞,他們是否被FIFO命令喚醒?
1:因爲goroutine執行_concurrently_。不要使用goroutines。 2.有關您的問題,請參閱https://golang.org/doc/faq#closures_and_goroutines。不,完全沒有。 – Volker