2017-04-03 6 views
-4

私はhttps://blog.golang.org/pipelinesから例を探しています:次のゴルーチンが実行されたら?

func main() { 
    in := gen(2, 3) 

    // Distribute the sq work across two goroutines that both read from in. 
    c1 := sq(in) 

    // When does this line below execute and what is in `in`? 
    c2 := sq(in) 

    // Consume the merged output from c1 and c2. 
    for n := range merge(c1, c2) { 
     fmt.Println(n) // 4 then 9, or 9 then 4 
    } 
} 

ときc2 := sq(in)実行していますか?私が理解しているように、それは前の行が終了したときではなく、即座にそれがゴルーチンであるときに実行されます。

c2c1によって受信されたメッセージの後に来た後で、次の着信メッセージを受け取ることができますか?

+5

いいえ、前の行が終了すると実行されます。 'go 'はないので、goroutineではありません。 ( 'gen'関数はゴルーチンを開始するかもしれませんが、それは完全に別々でバックグラウンドで実行されます)。 – psmears

答えて

0

あなたはこのような何かを行う必要がありますルーチンを行く使用するためには、ゴルーチンを使用していませんあなたのコード:

q := make(chan type) 
go sq(in, q) 
go sq(in, q) 

for elem := range q { 
    fmt.Println(elem) 
} 

とSQはすることができます

func sq(in type, q chan type) { 
    ... 
    q <- valueFromIn 
    ... 
} 

また、チャネルを介して値を返す必要がありますゴルーチンが終了するのを待つためにWaitGroupを使用してください。

関連する問題