gpt4 book ai didi

go - 使用 fan In 函数多路复用 Goroutine 输出

转载 作者:IT王子 更新时间:2023-10-29 01:11:14 24 4
gpt4 key购买 nike

我试图实现一个示例 Go 代码,用于使用从 go 例程返回的 channel ,而 main 函数中没有任何“读取 block ”。在这里,一个 fanIn 函数接受来自其他两个例程的 channel 并返回它作为输入。

此处,预期输出是来自两个内部例程的随机输出。但实际输出始终是一个“ann”后跟一个“john”,在任何情况下都不是随机的。

为什么我没有得到随机输出?

去 Playground :http://play.golang.org/p/46CiihtPwD

实际输出:

  you say: ann,0 
you say: john,0
you say: ann,1
you say: john,1
......

代码:

package main

import (
"fmt"
"time"
)

func main() {

final := fanIn(boring("ann"), boring("john"))

for i := 0; i < 100; i++ {
fmt.Println("you say:", <-final)

}
time.Sleep(4 * time.Second)
}

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

}
}()
return c1
}

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

最佳答案

没有特别的原因,这就是 Go 碰巧安排相关 goroutines 的方式(基本上,你“幸运”地发现了一个模式)。你不能依赖它。如果您真的想要一个真正可靠的随机结果,则必须以某种方式手动混合随机性。

还有来自 https://github.com/eapache/channels/Multiplex 函数(文档:https://godoc.org/github.com/eapache/channels#Multiplex)它与您的 fanIn 函数有效地做同样的事情。不过,我认为它在随机性方面不会有任何不同。

关于go - 使用 fan In 函数多路复用 Goroutine 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25404220/

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