저는 Go 언어에 비교적 익숙하지 않습니다. 비록 내가 그렇게 희망하지는 않지만 어리석은 질문으로 귀찮게합니다. 그냥 경우에 내 사과 ...슬라이스 유형 입력 및 출력 채널을 사용하여 동시 작업자 루틴으로 이동
여기 내 예제가 있습니다. main()에서 호출되는 worker() 함수를 동시 Go 루틴의 집합으로 정의했습니다. 입력 및 출력 데이터는 슬라이스 유형 [] int의 입력 및 출력 채널을 통해 제공됩니다. 어떤 경우에는 모든 것이 예상대로 작동하고, 다른 경우에는 결과가 잘못됩니다. 코드의 주석과 코드 아래의 프로그램 출력을 참조하십시오.
솔직히 두 코드 변종의 실제 차이점을 볼 수 없습니다. 나는 무엇을 여기에서 놓쳤 느냐? 조언 해 주셔서 감사합니다!
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)
}
}
올바른 출력 (변형 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]
잘못된 출력 (변형 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]