亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 1999 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號