簡體   English   中英

如何從多個goroutine寫入同一通道

[英]How to write to the same channel from multiple goroutines

我需要幾個goroutines在同一通道中編寫。 然后,所有數據都集中在一個位置,直到所有goroutine完成該過程為止。 但是我不確定如何最好地關閉此頻道。

這是我的示例實現:

func main() {
    ch := make(chan data)
    wg := &sync.WaitGroup{}
    for instance := range dataSet {
        wg.Add(1)
        go doStuff(ch, instance)
    }
    go func() {
        wg.Wait()
        close(ch)
    }()

    for v := range ch { //range until it closes
        //proceed v
    }
}

func doStuff(ch chan data, instance data) {
    //do some stuff with instance...
    ch <- instance
}

但我不確定這是慣用語言。

當您使用WaitGroup並在啟動新的goroutine時增加計數器時,必須在WaitGroup完成時通過調用Done()方法通知WaitGroup 另外,您必須將相同的WaitGroup傳遞給goroutine。 您可以通過傳遞WaitGroup的地址來WaitGroup 否則,每個goroutine將使用其自己的WaitGroup ,它將位於不同的范圍內。

func main() {
    ch := make(chan data)
    wg := &sync.WaitGroup{}
    for _, instance := range dataSet {
        wg.Add(1)
        go doStuff(ch, instance, wg)
    }
    go func() {
        wg.Wait()
        close(ch)
    }()

    for v := range ch { //range until it closes
        //proceed v
    }
}

func doStuff(ch chan data, instance data, wg *sync.WaitGroup) {
    //do some stuff with instance...
    ch <- instance

    // call done method to decrease the counter of WaitGroup
    wg.Done()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM