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

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

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

Go
噜噜哒 2022-06-06 17:42:30
我已经实现了 WaitGroup 但它没有按预期工作,我需要打印所有 1000 条日志,但实际结果只是 ~9xx 日志,我知道根本原因是第一个 gorouting 尚未完成,而其余的 goroutines 在缓冲通道的循环已经完成我该如何解决这个问题?提前致谢package mainimport (    "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 中运行代码并且它不会打印所有日志,如果我在终端中运行它应该没问题
查看完整描述

2 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

但它已经在发生了。


由于它没有正确订购,我认为它会误导你认为它只打印 ~9xx 日志。


我运行它并得到(未显示完整输出):


2020/06/03 10:38:35 done for item 986

2020/06/03 10:38:35 done for item 988

2020/06/03 10:38:35 done for item 1000

2020/06/03 10:38:35 done for item 995

2020/06/03 10:38:35 done for item 993

2020/06/03 10:38:35 done for item 996

2020/06/03 10:38:35 done for item 997

2020/06/03 10:38:35 done for item 991

2020/06/03 10:38:35 done for item 998

2020/06/03 10:38:35 done for item 990

2020/06/03 10:38:35 done for item 992

2020/06/03 10:38:35 done for item 999

2020/06/03 10:38:35 done for item 989

2020/06/03 10:38:35 done for item 412

注意:有 1000 个。


如果要确认:


go run main.go &> sample.txt // Redirects the output of the executable to sample.txt

cat sample.txt | wc -l       // Counts the number of lines in output

是1000。


查看完整回答
反对 回复 2022-06-06
?
跃然一笑

TA贡献1826条经验 获得超6个赞

我没有看到 waitgroup 有任何问题,它正在 go playground上打印所有 1000 条日志。



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

添加回答

举报

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