2013-05-19 37 views
2

我正在尝试跟随Rob Pike的Google I/O 2012会谈,名为“Go Concurrency”。我正在尝试通道复用的例子,因此“Ann”和“Joe”不会以锁步方式进行交谈。但是使用下面的代码,它们仍然是锁步。我哪里错了?为什么此Google I/O 2012并发示例不能按预期工作?

视频:http://www.youtube.com/watch?v=f6kdp27TYZs&feature=player_detailpage#t=1025s

package main 

import (
    "fmt" 
    "time" 
    "math/rand" 
    ) 

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

func main() { 
    c := fanIn(boring("Joe"), boring("Ann")) 
    for i:=0; i<10; i++ { 
     fmt.Println(<-c) 
    } 
    fmt.Printf("You're both boring, I'm leaving...\n") 
} 

func boring(msg string) <-chan string { 
    c := make(chan string) 
    go func() { // launch goroutine from inside the fn 
     for i:=0; ; i++ { 
      c <- fmt.Sprintf("%s %d", msg, i) 
      time.Sleep(time.Duration(rand.Intn(1e3)) * time.Millisecond) 
     } 
    }() 
    return c 
} 

而这个的(去版本go1.0.2在Ubuntu 10.04 LTS)的输出

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... 

哪儿我去错了吗?谢谢!

回答

7

你的代码没问题;它只是倾向于多一点让它们不同步。只是循环多次,你应该看到他们走出步调一致的:

for i := 0; i < 20; i++ { // Going up to 20 is enough to usually see it 
    fmt.Println(<-c) 
} 

我得到这样的输出:

 
Joe 0 
Ann 0 
Joe 1 
Ann 1 
Joe 2 
Ann 2 
Joe 3 
Ann 3 
Joe 4 
Ann 4 
Joe 5 
Ann 5 
Joe 6 
Ann 6 
Ann 7 
Joe 7 
Joe 8 
Joe 9 
Ann 8 
Ann 9 
相关问题