golang - go 实现生产者与消费者模型,如何判断channel中数据已全部消费?
本文介绍了golang - go 实现生产者与消费者模型,如何判断channel中数据已全部消费?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
code
package main
import (
"fmt"
)
var c = make(chan int, 50)
var count = 0
func main() {
for i := 0; i < 5; i++ {
go consumer(i)
}
for i := 0; i < 1000; i++ {
c <- i
}
/** here **/
fmt.Println(count)
}
func consumer(index int) {
for target := range c {
fmt.Printf("no.%d:%d\n", index, target)
count++
}
}
请问代码中注释处,如何才能确保c中的数据已经全部被消费?(默认time.Sleep()无法保证,不能使用)
如果不能确保的话,那么主线程会提前退出,部分数据就会被抛弃了。
解决方案
这种可以使用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
}
这篇关于golang - go 实现生产者与消费者模型,如何判断channel中数据已全部消费?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文