下面是摘自“ Google I/O 2012 - Go Concurrency Patterns ”(幻灯片)的代码示例
package main
import (
"fmt"
"time"
)
func main() {
joe := boring("Joe")
ann := boring("Ann")
for i := 0; i < 5; i++ {
fmt.Println(<-joe)
fmt.Println(<-ann)
}
fmt.Println("The end")
}
func boring(msg string) <-chan string {
c := make(chan string)
go func() {
for i := 0; ; i++ {
c <- fmt.Sprintf("%s %d", msg, i)
time.Sleep(time.Second)
}
}()
return c
}
输出:
Joe 0
Ann 0
Joe 1
Ann 1
Joe 2
Ann 2
Joe 3
Ann 3
Joe 4
Ann 4
The end
这是演讲者 Rob Pike 的解释(视频中的 16:33):“...我们正在读取 Joe 的值和 Ann 的值。而且由于频道的同步性质,两个人轮流进行,不仅打印出值,还执行它们。因为如果 Ann 准备发送值但 Joe 还没有这样做,Ann 仍然会被阻塞,等待将值传递给 main。 ”
这让我很困惑。“如果 Ann 准备发送值但 Joe 还没有这样做,Ann 仍将被阻止”是什么意思?正如我们所知,通道在两个 goroutine 之间建立通信并同步它们的执行。但是我们在这里创建了两个频道(joe和ann)。主协程分别通过joe和与两个新的协程对话ann。这是否意味着通道之间的同步性质也有效?或者主 goroutine 一次只能与一个其他 goroutine 通信?
哔哔one
繁星coding
森林海
相关分类