2017-04-03 4 views
-4

ich am Beispiel von https://blog.golang.org/pipelines suchen:Wenn die nächste Goroutine ausgeführt wird?

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

Wann c2 := sq(in) laufen? Was ich verstehe, wird nicht ausgeführt, wenn die vorherige Zeile endet, sondern sofort, da dies eine Goroutine ist.

Wird c2 die nächste eingehende Nachricht empfangen, die nach der Nachricht gesendet wird, die von c1 empfangen wird?

+5

Nein, es wird ausgeführt, wenn die vorherige Zeile beendet ist. Es gibt kein 'go', also ist es keine Goroutine. (Die gen-Funktion kann * eine Goroutine starten, aber das ist völlig separat und läuft im Hintergrund.) – psmears

Antwort

0

Ihr Code nicht goroutines verwenden, um Routinen zu verwenden, gehen Sie so etwas tun sollte:

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

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

und sq muss den Wert durch ein Sie

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

Auch

Kanal zurückkehren Verwenden Sie WaitGroup, um auf die Beendigung der Goroutinen zu warten.

Verwandte Themen