Sleep() 和同步之间有关系吗?

  • 本文关键字:有关系 之间 同步 Sleep go
  • 更新时间 :
  • 英文 :


请考虑以下演示频道的程序:

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检索该值;函数pingerponger无法将值发送到通道c(即pinger和ponger正在等待将值发送到通道,直到您从打印机功能读取(。

因此,在您的示例中,您通过 func 引入了时间延迟Sleep以从打印机函数上的通道c读取值。

这就是为什么你在功能:)的帮助下阅读得很好Sleep

最新更新