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

发布于 2022-09-05 07:33:44 字数 540 浏览 13 评论 0

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()无法保证,不能使用)
如果不能确保的话,那么主线程会提前退出,部分数据就会被抛弃了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

来世叙缘 2022-09-12 07:33:44

这种可以使用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
}
不必在意 2022-09-12 07:33:44

参考http://blog.csdn.net/kjfcpua/...已解决,使用WaitGroup就解决了

完整代码

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()
        }
     }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文