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

Go Sleep()和同步之间有关系吗?,go,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) {

考虑以下节目演示频道:

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)
}
主程序包
进口(
“fmt”
)
func pinger(c chan字符串){
对于i:=0;;i++{
C
Sleep()和同步之间有关系吗

没有

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

var c = make(chan string)

通道
c
一次可以保存一个字符串类型的值。直到从通道
检索到该值,但在没有睡眠的情况下应观察相同的模式,因为读写顺序应该相同,只是延迟会小得多。没有延迟,输出就像“乒乓”。这是为什么?当多个goroutine向通道发送值时,顺序不能保证。它可能会根据从通道读取的值而变化。例如:我执行了您的程序,输出是
pingping-pong-pong-pong-pong
。通常在例程中使用
Sleep
会允许其他路由ine要继续。
main()
goroutine也同时执行。你是说,你用
Sleep
执行了我的程序,并得到了你提到的模式?如果没有,这就是我困惑的根源。用
Sleep
,“ping”和“pong”交替执行(至少在我的机器上),没有睡眠,它们似乎以随机顺序出现。输出没有
sleep
。这就是为什么输出是随机的,基本上在日常工作中,顺序是不保证的。我们在围棋社区都在互相帮助。别担心。当使用
sleep
时,它会阻止goroutine的执行(你已经知道这一点)。当某个例程进入睡眠状态时,另一个例程将以伪随机方式执行。请在结束时尝试此操作。顺序将随睡眠而变化。正如我之前提到的,睡眠“确实会产生,允许另一个例程继续”。