多个go例程的一个障碍
One barrier for multiple go routines
我正在试验 go 例程。
我有一个 go 例程函数执行了 x 次,我想等待所有这些例程在我的主函数中继续。我尝试使用chan作为屏障。
我试过类似的东西:
func goroutine(i int, ch []chan bool) {
//do stuff
ch[i] <- true
}
func main() {
var ch []chan bool
for i := 0; i < nb; i++ {
ch[i] = make(chan bool)
go goroutine(i, ch)
}
// wait to continue
for i := 0; i < nb; i++ {
<- ch[i]
}
}
我有以下错误:panic: runtime error: index out of range
行 ch[i] = make(chan bool)
第一个问题:
- 使用 chan 是好的解决方案吗?
第二个问题:
- 为什么我有这个索引超出范围的错误?
如果您只想等待 goroutine 完成并且不需要通过通道返回结果,那么 sync.WaitGroup
将是一个更简洁的解决方案。可行的方法是:
- 创建一个 WaitGroup wg,每当您启动 goroutine 调用时
wg.Add(1)
并将指向 wg 的指针传递给 goroutine。
- 在goroutine中,返回调用前
wg.Done()
- 要等待所有 goroutine 完成,请调用
wg.Wait()
我正在试验 go 例程。
我有一个 go 例程函数执行了 x 次,我想等待所有这些例程在我的主函数中继续。我尝试使用chan作为屏障。
我试过类似的东西:
func goroutine(i int, ch []chan bool) {
//do stuff
ch[i] <- true
}
func main() {
var ch []chan bool
for i := 0; i < nb; i++ {
ch[i] = make(chan bool)
go goroutine(i, ch)
}
// wait to continue
for i := 0; i < nb; i++ {
<- ch[i]
}
}
我有以下错误:panic: runtime error: index out of range
行 ch[i] = make(chan bool)
第一个问题:
- 使用 chan 是好的解决方案吗?
第二个问题:
- 为什么我有这个索引超出范围的错误?
如果您只想等待 goroutine 完成并且不需要通过通道返回结果,那么 sync.WaitGroup
将是一个更简洁的解决方案。可行的方法是:
- 创建一个 WaitGroup wg,每当您启动 goroutine 调用时
wg.Add(1)
并将指向 wg 的指针传递给 goroutine。 - 在goroutine中,返回调用前
wg.Done()
- 要等待所有 goroutine 完成,请调用
wg.Wait()