2 回答

TA貢獻1802條經驗 獲得超6個贊
這種可以使用sync里的WaitGroup工具來做等待,也可以單獨開個channel來等待。如果只是想單純的保證goroutine全部執行完畢再退出main,可以定義個相同數量buffer的channel,每個goroutine執行結束后就寫入這個channel,而main只要消費等待channel就可以達到阻塞的目的了。
類似這樣
var c = make(chan int, 50)
var count = 0
var retChannel = make(chan int,5)
func main() {
for i := 0; i < 5; i++ {
go consumer(i)
}
for i := 0; i < 1000; i++ {
c <- i
}
/** here **/
close(c)
for i := 0; i < 5; i++ {
<-retChannel
}
close(retChannel)
fmt.Println(count)
}
func consumer(index int) {
for target := range c {
fmt.Printf("no.%d:%d\n", index, target)
count++
}
retChannel <- index
}

TA貢獻1830條經驗 獲得超9個贊
package main
import (
"fmt"
"sync"
)
var c = make(chan int, 50)
var count = 0
var wg = new(sync.WaitGroup)
func main() {
for i := 0; i < 5; i++ {
wg.Add(1)
go consumer(i)
}
for i := 0; i < 1000; i++ {
c <- i
}
wg.Wait()
close(c)
/** here **/
fmt.Println(count)
}
func consumer(index int) {
for target := range c {
fmt.Printf("no.%d:%d\n", index, target)
count++
if len(c) <= 0 {
wg.Done()
}
}
}
- 2 回答
- 0 關注
- 1999 瀏覽
添加回答
舉報