考虑以下程序演示渠道:
package main
import (
"fmt"
)
func pinger(c chan string) {
for i := 0; ; i++ {
c <- "ping"
}
}
func ponger(c chan string) {
for i := 0; ; i++ {
c <- "pong"
}
}
func printer(c chan string) {
for {
msg := <-c
fmt.Println(msg)
//time.Sleep(time.Second * 1)
}
}
func main() {
var c = make(chan string)
go pinger(c)
go ponger(c)
go printer(c)
var input string
fmt.Scanln(&input)
}
如果我取消注释time.Sleep
电话,则输出为&#34; ping&#34;和&#34; pong&#34;轮流以一种不错的,可预测的方式轮流。但是,添加注释会使订单无法预测。我是一个Go新手,想知道是什么启用了此同步。为什么增加等待时间会使通道馈线的其余部分拖到线路上?
答案 0 :(得分:1)
Sleep()和同步之间是否有关系?
NO
在发送到通道的值和从通道检索的值之间发生同步。
var c = make(chan string)
频道c
一次可以保存一个字符串值。直到从通道<- c
检索值;函数pinger
,ponger
无法向通道c
发送值(即pinger和ponger正在等待向通道发送值,直到您从打印机功能读取为止)。
因此,在您的示例中,您通过Sleep
func引入了时间延迟,以便在打印机功能上读取通道c
中的值。
这就是为什么你在Sleep
func :)的帮助下获得良好和缓慢的阅读