跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • golang 中 goroutine 使用 chan 数据丢失的问题
未分類
22 2 月 2022

golang 中 goroutine 使用 chan 数据丢失的问题

golang 中 goroutine 使用 chan 数据丢失的问题

資深大佬 : reber0ask 40

下面的代码,注释的地方,通过 for range 遍历时 go show1(x) 可以正常输出 1 到 10

但是使用 for 遍历时 go show2(x) 有时候不能完整的输出,只能输出 1 到 9 ,会丢失一部分

想问下是否我代码中 goroutine 使用的有问题,还是说只能通过 for range 给 goroutine 传值?

var (  wg = sync.WaitGroup{} )  func show1(x int) {  defer wg.Done()   fmt.Println(x) }  func show2(ch chan int) {  defer wg.Done()   c := <-ch  fmt.Println(c) }  func main() {  ch1 := make(chan int, 40)   for i := 1; i < 11; i++ {   ch1 <- i  }  close(ch1)   // for x := range ch1 {  //  wg.Add(1)  //  go show1(x)   // }   for j := 1; j < len(ch1)+1; j++ {   wg.Add(1)   go show2(ch1)  }   wg.Wait() } 

大佬有話說 (12)

  • 資深大佬 : k9982874

    这代码嘈点太多。。自己再仔细自查一下

  • 主 資深大佬 : reber0ask

    @k9982874 刚开始学 go ,,

  • 資深大佬 : yanzhiling2001

    @k9982874 求指点

  • 資深大佬 : FakNoCNName

    先考虑算法问题。
    len(ch1)是个动态的值,你每次读取、写入数据都会变化。
    按照你写的算法,最多输出 10~6 这几个数字,很好奇为什么只丢了一个?
    改成下面的试试:
    n := len(ch1)
    for j := 0; j < n; j++ {
    wg.Add(1)
    go show2(ch1)
    }

  • 資深大佬 : LemonK

    len(ch1) 会变小。

  • 資深大佬 : clearT

    就是上面层说的问题,len(ch1) 是个动态的值,按照你那种写法也不一定只会丢一个,和 goroutine 的调度也有关系,所以运行结果是不确定的,丢几个都有可能

  • 主 資深大佬 : reber0ask

    @LemonK 如果只向 chan 中传入了 1 到 10 的话可能丢失一个数字 10 ,如果传入 1 到 20 的话可能只能输出 1 到 17 、18 这样子, 按你的代码在 for 的外面使用 n := len(ch1)的话是没有问题的,确实可以输出 1 到 10 ,不会丢失数据

  • 主 資深大佬 : reber0ask

    @LemonK @FakNoCNName @clearT 谢谢,明白了,确实是这样

  • 資深大佬 : mmrindextt

    for 中 go , 就值得细品了

  • 資深大佬 : zjj19950716

    @mmrindextt 展开讲讲

  • 資深大佬 : snowlyg

    又看到这个问题,好想吐槽一下。哈哈

  • 資深大佬 : wakaka

    不得要领

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具