等待添加到缓冲通道的所有项目

我已经实现了 WaitGroup 但它没有按预期工作,我需要打印所有 1000 条日志,但实际结果只是 ~9xx 日志,我知道根本原因是第一个 gorouting 尚未完成,而其余的 goroutines 在缓冲通道的循环已经完成


我该如何解决这个问题?提前致谢


package main


import (

    "log"

    "sync"

)


func main() {

    buffer := make(chan int, 5)

    var wg sync.WaitGroup

    wg.Add(1)

    go func(wg *sync.WaitGroup) {

        for i := 1; i <= 1000; i++ {

            buffer <- i

        }


        close(buffer)

        wg.Done()

    }(&wg)


    for item := range buffer {

        wg.Add(1)

        go func(wg *sync.WaitGroup, item int) {

            log.Printf("done for item %d\n", item)

            wg.Done()

        }(&wg, item)

    }


    wg.Wait()

}


更新


我发现了问题,我在 GoLand IDE 中运行代码并且它不会打印所有日志,如果我在终端中运行它应该没问题


噜噜哒
浏览 114回答 2
2回答

拉丁的传说

但它已经在发生了。由于它没有正确订购,我认为它会误导你认为它只打印 ~9xx 日志。我运行它并得到(未显示完整输出):2020/06/03 10:38:35 done for item 9862020/06/03 10:38:35 done for item 9882020/06/03 10:38:35 done for item 10002020/06/03 10:38:35 done for item 9952020/06/03 10:38:35 done for item 9932020/06/03 10:38:35 done for item 9962020/06/03 10:38:35 done for item 9972020/06/03 10:38:35 done for item 9912020/06/03 10:38:35 done for item 9982020/06/03 10:38:35 done for item 9902020/06/03 10:38:35 done for item 9922020/06/03 10:38:35 done for item 9992020/06/03 10:38:35 done for item 9892020/06/03 10:38:35 done for item 412注意:有 1000 个。如果要确认:go run main.go &> sample.txt // Redirects the output of the executable to sample.txtcat sample.txt | wc -l&nbsp; &nbsp; &nbsp; &nbsp;// Counts the number of lines in output是1000。

跃然一笑

我没有看到 waitgroup 有任何问题,它正在 go&nbsp;playground上打印所有 1000 条日志。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go