gpt4 book ai didi

转到 channel : the function of one extra line

转载 作者:IT王子 更新时间:2023-10-29 00:45:32 25 4
gpt4 key购买 nike

我正在学习 Go 中的并发模式,不确定点 A 的目的是什么?

代码取自:https://talks.golang.org/2012/concurrency.slide#30

谁能给我解释一下?谢谢

type Message struct {
str string
wait chan bool
}

func main() {
c := fanIn(boring("Joe"), boring("Ann"))
for i := 0; i < 5; i++ {
msg1 := <-c
fmt.Println(msg1.str)
msg2 := <-c
fmt.Println(msg2.str)
msg1.wait <- true
msg2.wait <- true
}
fmt.Println("You're both boring; I'm leaving.")
}

func fanIn(input1, input2 <-chan Message) <-chan Message {
c := make(chan Message)
go func() {
for {
c <- <-input1
}
}()
go func() {
for {
c <- <-input2
}
}()
return c
}

func boring(msg string) <-chan Message {
waitForIt := make(chan bool)
c := make(chan Message)
go func() { // We launch the goroutine from inside the function.
for i := 0; ; i++ {
c <- Message{fmt.Sprintf("%s %d", msg, i), waitForIt}
time.Sleep(time.Duration(rand.Intn(2e3)) * time.Millisecond)
<-waitForIt // <-----------------Point A
}
}()
return c // Return the channel to the caller.
}

最佳答案

fanIn 产生两个 goroutines 从第一个和第二个“无聊的”消息 channel 读取数据。由于两个 goroutine 中的任何一个都可能正在运行(另一个 goroutine 也在休眠或运行),我们不知道元素写入统一 channel 的顺序:

A A A A A \
> A B B A A A B A B B
B B B B B /

请注意,生成的序列没有特定顺序。

这可以通过 commenting out the "waiting"-channels 来证明:

Joe 0
Ann 0
Joe 1
Ann 1
Joe 2
Ann 2
Joe 3
Joe 4
Joe 5
Ann 3
You're both boring; I'm leaving.

等待 channel 的存在是为了恢复您链接的幻灯片所说的顺序。我们想要这个:

A A A A A \
> A B A B A B A B A B
B B B B B /

请注意 Ann 和 Joe 如何 talk one after the other now :

Joe 0
Ann 0
Joe 1
Ann 1
Joe 2
Ann 2
Joe 3
Ann 3
Joe 4
Ann 4
You're both boring; I'm leaving.

这段代码的作者决定通过让它们在 waitForIt 上等待并在 main 中通知来同步对 channel 的写入。此行为依赖于我们在 mainfor 循环中获得的前两条消息是否有序。如果不是,我们将得到相反的序列。

也许我没有看到任何更多的绝对同步保证,也许作者不关心序列的顺序,只要它是一个重复序列,但这段代码并没有让我觉得是一个特别好的例子并发和同步。

关于转到 channel : the function of one extra line,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26115537/

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