Ich bin relativ neu in der Go-Sprache. Obwohl ich es nicht hoffe, störe ich Sie vielleicht mit einer dummen Frage. Meine Entschuldigung im Voraus, nur für den Fall ...Gehen konkurrierende Worker-Routinen mit Slice-Typ Eingabe- und Ausgabekanäle
Hier ist mein Beispiel: Ich habe eine worker() -Funktion definiert, die von main() als eine Reihe von gleichzeitigen Go-Routinen aufgerufen wird. Eingangs- und Ausgangsdaten werden über einen Eingangs- und einen Ausgangskanal des Slice-Typs [] int bereitgestellt. In einem Fall funktioniert alles wie erwartet, im anderen Fall ist das Ergebnis fehlerhaft. Siehe die Kommentare im Code und die Programmausgabe unter dem Code.
Ehrlich gesagt, sehe ich nicht den tatsächlichen Unterschied zwischen beiden Code-Varianten. Was habe ich hier vermisst? Danke für irgendeinen Rat!
package main
import "fmt"
import "runtime"
func worker(x_ch <-chan []int, y_ch chan<- []int, wid int) {
for x := range x_ch {
y := x
fmt.Println(" worker", wid, "x:", x)
fmt.Println(" worker", wid, "y:", y)
y_ch <- y
}
}
func main() {
n_workers := runtime.NumCPU()
n_len := 4
n_jobs := 4
x := make([]int, n_len)
x_ch := make(chan []int, 10)
y_ch := make(chan []int, 10)
for j := 0; j < n_workers; j++ { go worker(x_ch, y_ch, j) }
for k := 0; k < n_jobs; k++ {
// variant 1: works!
x = []int{k, k, k, k}
// variant 2: doesn't work!
// for i := range x { x[i] = k }
fmt.Println("main x:", k, x)
x_ch <- x
}
close(x_ch)
for i := 0; i < n_jobs; i++ {
z := <- y_ch
fmt.Println(" main y:", i, z)
}
}
richtige Ausgabe (Variante 1):
main x: 0 [0 0 0 0]
main x: 1 [1 1 1 1]
main x: 2 [2 2 2 2]
main x: 3 [3 3 3 3]
worker 3 x: [3 3 3 3]
worker 3 y: [3 3 3 3]
worker 2 x: [2 2 2 2]
worker 2 y: [2 2 2 2]
worker 1 x: [0 0 0 0]
worker 1 y: [0 0 0 0]
worker 0 x: [1 1 1 1]
worker 0 y: [1 1 1 1]
main y: 0 [3 3 3 3]
main y: 1 [2 2 2 2]
main y: 2 [0 0 0 0]
main y: 3 [1 1 1 1]
Wrong Ausgang (Variante 2):
main x: 0 [0 0 0 0]
main x: 1 [1 1 1 1]
main x: 2 [2 2 2 2]
main x: 3 [3 3 3 3]
worker 3 x: [3 3 3 3]
worker 3 y: [3 3 3 3]
main y: 0 [3 3 3 3]
worker 0 x: [2 2 2 2]
worker 0 y: [3 3 3 3]
main y: 1 [3 3 3 3]
worker 1 x: [1 1 1 1]
worker 1 y: [3 3 3 3]
main y: 2 [3 3 3 3]
worker 2 x: [3 3 3 3]
worker 2 y: [3 3 3 3]
main y: 3 [3 3 3 3]