go 实现生产者与消费者模型,如何判断channel中数据已全部消费?

code
packagemain
import(
"fmt"
)
varc=make(chanint,50)
varcount=0
funcmain(){
fori:=0;i<5;i++{
goconsumer(i)
}
fori:=0;i<1000;i++{
c<-i
}
/**here**/
fmt.Println(count)
}
funcconsumer(indexint){
fortarget:=rangec{
fmt.Printf("no.%d:%d\n",index,target)
count++
}
}
请问代码中注释处,如何才能确保c中的数据已经全部被消费?(默认time.Sleep()无法保证,不能使用)如果不能确保的话,那么主线程会提前退出,部分数据就会被抛弃了。
扬帆大鱼
浏览 433回答 2
2回答

慕尼黑的夜晚无繁华

这种可以使用sync里的WaitGroup工具来做等待,也可以单独开个channel来等待。如果只是想单纯的保证goroutine全部执行完毕再退出main,可以定义个相同数量buffer的channel,每个goroutine执行结束后就写入这个channel,而main只要消费等待channel就可以达到阻塞的目的了。类似这样varc=make(chanint,50)varcount=0varretChannel=make(chanint,5)funcmain(){fori:=0;i
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript