【发布时间】:2016-05-31 05:51:08
【问题描述】:
我是 Go 的新手,我想异步运行几个任务,等待所有任务完成并将结果收集到一个切片中。
我阅读了很多文档和示例,特别是这个Nathan LeClaire's post,并想出了一些接近我想做的事情(见下面的代码)。机制很简单:
- 10 个 goroutine 被触发,每个 goroutine 都在通道中写入一个值。
- 另一个 goroutine 读取通道并填充切片。
- 所有这些都完成后,切片就打印出来了。
但是,结果显示了一个 9 长度的切片(值从 0 到 8),而第 10 个值(应该是 9)似乎丢失了。程序退出就好了,我不知道发生了什么。任何提示表示赞赏。
这是一个使用http://play.golang.org/p/HUFOZLmCto的代码示例:
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
n := 10
c := make(chan int)
wg.Add(n)
for i := 0; i < n; i++ {
go func(val int) {
defer wg.Done()
fmt.Println("Sending value to channel: ", val)
c <- val
}(i)
}
var array []int
go func() {
for val := range c {
fmt.Println("Recieving from channel: ", val)
array = append(array, val)
}
}()
wg.Wait()
fmt.Println("Array: ", array)
}
结果如下:
Sending value to channel: 0
Recieving from channel: 0
Sending value to channel: 1
Recieving from channel: 1
Sending value to channel: 2
Recieving from channel: 2
Sending value to channel: 3
Recieving from channel: 3
Sending value to channel: 4
Recieving from channel: 4
Sending value to channel: 5
Recieving from channel: 5
Sending value to channel: 6
Recieving from channel: 6
Sending value to channel: 7
Recieving from channel: 7
Sending value to channel: 8
Recieving from channel: 8
Sending value to channel: 9
Array: [0 1 2 3 4 5 6 7 8] // Note 9 is missing here
【问题讨论】:
标签: go concurrency channel