请考虑以下演示频道的程序:
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
调用,输出是"ping"和"pong"以一种很好的、可预测的方式轮流出现。但是,添加注释会使顺序不可预测。我是 Go 新手,想知道是什么启用了这种同步。为什么增加等待时间会使通道馈线的其余部分拖曳线路?
Sleep(( 和同步之间有关系吗?
不
同步发生在发送到通道的值和从通道检索的值之间。
var c = make(chan string)
通道c
一次可以保存一个字符串类型的值。直到从通道<- c
检索该值;函数pinger
,ponger
无法将值发送到通道c
(即pinger和ponger正在等待将值发送到通道,直到您从打印机功能读取(。
因此,在您的示例中,您通过 func 引入了时间延迟Sleep
以从打印机函数上的通道c
读取值。
这就是为什么你在功能:)的帮助下阅读得很好Sleep
慢