猿问

Golang:为什么增加缓冲通道的大小会消除我的 goroutine 的输出?

我试图理解为什么使通道的缓冲区大小发生更大的变化会导致我的代码意外运行。如果缓冲区小于我的输入(100 个整数),则输出符合预期,即 7 个 goroutines 每个读取输入的子集并在另一个打印它的通道上发送输出。如果缓冲区大小与输入相同或大于输入,我将不会得到任何输出也不会出错。我是否在错误的时间关闭了频道?我对缓冲区的工作方式有错误的期望吗?或者是其他东西?


package main


import (

    "fmt"

    "sync"

)


var wg1, wg2 sync.WaitGroup


func main() {

    share := make(chan int, 10)

    out := make(chan string)

    go printChan(out)

    for j:= 1; j<=7; j++ {

        go readInt(share, out, j)

    }

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

        share <- i

    }

    close(share)

    wg1.Wait()

    close(out)

    wg2.Wait()

}

func readInt(in chan int, out chan string, id int) {

    wg1.Add(1)

    for n := range in {

        out <- fmt.Sprintf("goroutine:%d was sent %d", id, n)

    }

    wg1.Done()

}

func printChan(out chan string){

    wg2.Add(1)

    for l := range out {

        fmt.Println(l)

    }

    wg2.Done()

}

运行这个:小缓冲区,预期输出。http://play.golang.org/p/4r7rTGypPO 大缓冲区,无输出。http://play.golang.org/p/S-BDsw7Ctu


撒科打诨
浏览 200回答 1
1回答

鸿蒙传说

这与缓冲区的大小没有直接关系。添加缓冲区会暴露您正在调用的错误waitGroup.Add(1)您必须WaitGroup&nbsp;在分派 goroutine之前添加到,否则您可能最终会在执行Wait()&nbsp;之前调用waitGroup.Add(1)。http://play.golang.org/p/YaDhc6n8_B它在第一个而不是第二个中工作的原因是因为同步发送确保 gouroutine 至少执行了那么远。在第二个示例中,for 循环填充通道,关闭它并在其他任何事情发生之前调用 Wait。
随时随地看视频慕课网APP

相关分类

Go
我要回答