为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
守着星空守着你 2018-08-31 11:08:06
package mainimport (    "fmt")var c = make(chan int, 50)var count = 0func 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()无法保证,不能使用)如果不能确保的话,那么主线程会提前退出,部分数据就会被抛弃了。
查看完整描述

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

}


查看完整回答
反对 回复 2018-09-06
?
慕标琳琳

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()

        }

     }

}


查看完整回答
反对 回复 2018-09-06
  • 2 回答
  • 0 关注
  • 1788 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信