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的执行(你已经知道这一点)。当某个例程进入睡眠状态时,另一个例程将以伪随机方式执行。请在结束时尝试此操作。顺序将随睡眠而变化。正如我之前提到的,睡眠“确实会产生,允许另一个例程继续”。