使用fanIn功能复用Go Routine Output

时间:2014-08-20 12:03:50

标签: go

我试图实现一个示例Go代码,用于使用来自例程的返回通道而不需要任何"读取块"在主要功能。这里,fanIn函数接受来自另外两个例程的通道并返回作为输入的通道。

这里,预期输出是来自两个内部例程的随机输出。但实际输出总是一个" ann"其次是" john",在任何情况下都不是随意的。

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

去游乐场: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
}

1 个答案:

答案 0 :(得分:2)

没有特别的原因,那就是Go如何安排相关的goroutines(基本上,你得到了#34;幸运&#34;那是一种模式)。你不能依赖它。如果你真的想要一个实际可靠的随机结果,你必须以某种方式手动混合随机。

还有来自https://github.com/eapache/channels/Multiplex功能(doc:https://godoc.org/github.com/eapache/channels#Multiplex),它与您的fanIn功能完全相同。我不认为它在随机性方面会有任何不同。