Sleep()和同步之间是否存在关系?

时间:2017-07-08 16:47:17

标签: 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电话,则输出为&#34; ping&#34;和&#34; pong&#34;轮流以一种不错的,可预测的方式轮流。但是,添加注释会使订单无法预测。我是一个Go新手,想知道是什么启用了此同步。为什么增加等待时间会使通道馈线的其余部分拖到线路上?

1 个答案:

答案 0 :(得分:1)

  

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

     

NO

在发送到通道的值和从通道检索的值之间发生同步。

var c = make(chan string)

频道c一次可以保存一个字符串值。直到从通道<- c检索值;函数pingerponger无法向通道c发送值(即pinger和ponger正在等待向通道发送值,直到您从打印机功能读取为止)。

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

这就是为什么你在Sleep func :)的帮助下获得良好和缓慢的阅读