Golang频道不会收到消息

时间:2017-12-05 03:32:34

标签: go

我尝试探索go频道,我创建频道缓冲区最大10,gomaxprocess是2,但我想知道为什么这段代码不会收到消息

runtime.GOMAXPROCS(2)
messages := make(chan int, 9)

go func() {
    for {
        i := <-messages
        fmt.Println("Receive data:", i)
    }
}()
for i := 0; i <= 9; i++ {
    fmt.Println("Send data ", i)
    messages <- i
}

2 个答案:

答案 0 :(得分:0)

你的案例就像this一样,虽然它似乎可以在某些时候运作,但并不能保证永远。

只是为了添加一些上下文,在一个无缓冲的通道中,发送转到例程被阻塞,因为它试图发送一个值并且保证在唤醒发送转发例程之前发生接收(在这种情况下是主程序),所以在这种情况下,它似乎是一个可行的选择。但是,在执行接收转到例程中的print语句之前,发送转到例程仍然可以退出。所以基本上你需要使用一种同步机制,这样只有在接收器中的工作完成后才会退出发送过程。

Here's如何使用同步机制,对其进行注释,以便您可以更好地理解它。这适用于缓冲和非缓冲通道。 Another option是在主线程中使用receive,以便在接收处理完成之前不会退出,这样就不需要单独的同步机制了。希望这会有所帮助。

答案 1 :(得分:0)

  1. 您创建了一个具有9个缓冲区空间的通道,这意味着在第10个元素准备好发送到消息之前,主例程(r1)不会被阻塞。

  2. 在你的go func()(r2)中,当r1几乎完成r2是一个新例程并且系统需要时间来创建堆栈等时,它很可能开始运行。

  3. 所以,r2没有打印任何内容,因为r1已经完成,程序退出而r2刚刚开始运行。