gpt4 book ai didi

go - go routines 怎么可能完美交错呢?

转载 作者:IT王子 更新时间:2023-10-29 02:05:27 24 4
gpt4 key购买 nike

令我惊讶的是,go 例程似乎完美地交错......看到这个之后,我开始相信我还没有了解一些关于内部的缺失信息。示例:

$ go run x.go > output
$ grep ping output | wc -l
404778
$ grep pong output | wc -l
404777
$ cat x.go
package main
import (
"fmt"
"time"
)

type Ball struct{ hits int }

func main() {
table := make(chan *Ball)
go player("ping", table)
go player("pong", table)

table <- new(Ball) // game on; toss the ball
time.Sleep(1 * time.Second)
<-table // game over; grab the ball
}

func player(name string, table chan *Ball) {
for {
ball := <-table
ball.hits++
fmt.Println(name, ball.hits)
//time.Sleep(1 * time.Millisecond)
table <- ball
}
}

无论您在播放器函数中设置超时(或将其全部删除)多长时间,您总是会得到#ping == #ping +/- 1。

最佳答案

您正在使用一个无缓冲的 channel ,并且您的两个 goroutines 与它同步。使用无缓冲 channel , channel 写入(table <- ball)只能在某个地方有人完成读取(<-table)后才能完成,因此单个 goroutine 永远无法读取它正在写入的值。这就是这个例子的重点。

关于go - go routines 怎么可能完美交错呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29064946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com