gpt4 book ai didi

go - Rob Pike 在 Go 中的 "the synchronization nature of the channels"是什么意思?

转载 作者:IT王子 更新时间:2023-10-29 00:50:21 24 4
gpt4 key购买 nike

这是从“Google I/O 2012 - Go Concurrency Patterns”(slides)中获取的代码示例

package main

import (
"fmt"
"time"
)

func main() {
joe := boring("Joe")
ann := boring("Ann")
for i := 0; i < 5; i++ {
fmt.Println(<-joe)
fmt.Println(<-ann)
}
fmt.Println("The end")
}

func boring(msg string) <-chan string {
c := make(chan string)
go func() {
for i := 0; ; i++ {
c <- fmt.Sprintf("%s %d", msg, i)
time.Sleep(time.Second)
}
}()
return c
}

输出:

Joe 0
Ann 0
Joe 1
Ann 1
Joe 2
Ann 2
Joe 3
Ann 3
Joe 4
Ann 4
The end

这是演讲者 Rob Pike 的解释(视频中的 16:33):“......我们正在读取来自 Joe 的值和来自 Ann 的值。并且由于 channel 的同步性质,这两个家伙轮流,不仅打印出值,而且执行它们。因为如果 Ann 准备发送一个值但 Joe 还没有这样做,Ann 仍然会被阻塞,等待传递值到主要。”

这让我很困惑。 “如果 Ann 准备好发送一个值但 Joe 还没有这样做,Ann 仍然会被阻止”是什么意思?正如我们所知, channel 在两个 goroutine 之间建立通信并同步它们的执行。但是我们在这里创建了两个 channel (joeann)。主 goroutine 分别通过 joeann 与两个新的 goroutine 进行对话。这是否意味着同步性质在 channel 之间也有效?或者主 goroutine 一次只能与另一个 goroutine 对话?

最佳答案

它只是表示those channels are unbuffered .

    fmt.Println(<-joe)
fmt.Println(<-ann)

在第一行完成之前,第二行将无法执行。
在 joe 的 channel 中写入内容之前,第一个不会完成。

如果 Ann 的 channel 已经有值,则 Ann 将无法写入该 channel 。
在先读取 joe 的 channel ( fmt.Println(<-ann) ) 之前,不会读取该 channel ( fmt.Println(<-joe) )。

两个 channel 都是独立的(彼此不知道),但是读取操作的顺序性质使得一个 channel 等待另一个 channel 先被读取。

关于go - Rob Pike 在 Go 中的 "the synchronization nature of the channels"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32153093/

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