2016-08-26 3 views
1

저는 이동 중에도 채널을 통해 병렬 처리 및 통신을 구현하려고합니다.골란 채널을 순서대로 읽으십시오.

기본적으로 해결하려고하는 것은 특정 데이터를 병렬로 처리하고 순서대로 결과를 얻는 것입니다.> 도입 된 유형은 Chunk입니다 (아래 참조).

각 청크 처리에 대해 새 채널을 만들고 slice => 안에 보관하면 이후에 반복하여 순서대로 처리해야합니다.

내 프로그램의

간체 버전 (https://play.golang.org/p/RVtDGgUVCV)입니다 :

package main 

import (
    "fmt" 
) 

type Chunk struct { 
    from int 
    to int 
} 

func main() { 
    chunks := []Chunk{ 
     Chunk{ 
      from: 0, 
      to: 2, 
     }, 
     Chunk{ 
      from: 2, 
      to: 4, 
     }, 
    } 

    outChannels := [](<-chan struct { 
     string 
     error 
    }){} 

    for _, chunk := range chunks { 
     outChannels = append(outChannels, processChunk(&chunk)) 
    } 

    for _, outChannel := range outChannels { 
     for out := range outChannel { 
      if out.error != nil { 
       fmt.Printf("[ERROR] %s", out.error) 
       return 
      } 

      fmt.Printf("[STDOUT] %s", out.string) 
     } 
    } 
} 

func processChunk(c *Chunk) <-chan struct { 
    string 
    error 
} { 

    outChannel := make(chan struct { 
     string 
     error 
    }) 

    go func() { 
     outChannel <- struct { 
      string 
      error 
     }{fmt.Sprintf("from: %d to: %d\n", c.from, c.to), nil} 

     close(outChannel) 
    }() 

    return outChannel 
} 

내가 볼의 출력은 다음과 같습니다 나는 그러나보고 기대하는 무엇

[STDOUT] from: 2 to: 4 
[STDOUT] from: 2 to: 4 

은 다음과 같습니다

[STDOUT] from: 0 to: 2 
[STDOUT] from: 2 to: 4 

여기서 내가 뭘 잘못하고 있니? 나는 그것을 보지 않는다.

답변

2

문제가있는 것은 main의 첫 번째 for 루프입니다. for range 루프를 사용하면 루프 변수 (여기서는 chunk)가 생성되고 반복마다 각 슬라이스 요소의 복사본이 할당됩니다.

processChunk(&chunk)을 호출하면이 루프 변수의 주소가 전달되며이 변수의 값은 반복 될 때마다 변경됩니다. 따라서 processChunk 함수는 항상 chunks 루프의 마지막 항목에서 작업을 끝냅니다. 이는 for 루프가 끝난 후 *chunk이 가리키는 대상이기 때문입니다. https://play.golang.org/p/A1_DtkncY_

당신은 더 약 rangehere을 읽을 수 있습니다

for i := 0; i < len(chunks); i++ { 
    // pass chunk objects by indexing chunks 
    outChannels = append(outChannels, processChunk(&chunks[i])) 
} 

고정 코드 :

는 사용 슬라이스 인덱싱을 해결하려면.