2017-04-01 3 views
-2

다른 채널의 작전에 영향을 미칠인가, 그것은 하나 개의 채널 작전은 채널 B를 보낸 후 채널 (C)가 지난 루틴 채널이 전송되지 않고, 전송 어떻게 든 경우, 채널의 기본 원리 방법을 알고 노력하고, 나는이 간단한 코드를 만들어

나는 2 채널, 채널 c는 4 분할로 채널 b를 분할합니다.

package main 

import (
     "fmt" 
     "strconv" 
) 

func runner(idx int, c chan []int, b chan []int) { 
     var temp []int 
     fmt.Println("runner " + strconv.Itoa(idx)) 
     bucket := <-b 
     for k, v := range bucket { 
      if v != 0 { 
       temp = append(temp, v) 
       bucket[k] = 0 
      } 
      if len(temp) == 5 { 
       break 
      } 
     } 

     //Strange condition if channel c is sent after channel b is sent, 
     //somehow the last chan is not being sent 
     b <- bucket 
     c <- temp 

     //this is right if channel b is sent after channel c is sent 
    //c <- temp 
    //b <- bucket 

} 

func printer(c chan []int) { 
     for { 
      select { 
      case msg := <-c: 
       fmt.Println(msg) 
       //time.Sleep(time.Second * 1) 
      } 
     } 
} 

func main() { 

     c := make(chan []int, 5) 
     bucket := make(chan []int) 

     go runner(1, c, bucket) 
     go runner(2, c, bucket) 
     go runner(3, c, bucket) 
     go runner(4, c, bucket) 

     bucket <- []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20} 

     go printer(c) 

     var input string 
     fmt.Scanln(&input) 

} 
+0

이 코드를 사용하여 실제로 명확하지 않은 것은 분명하지 않습니다. 무엇을 얻고 실제로 얻는 것이 있습니까? – zerkms

+0

코드를 실행 했습니까? 러너 기능을 확인하십시오. 채널 C로 먼저 보내고 나서 b, u가 올바른 조건을 갖게되면, 이것이 내가 이해하지 못하는 것입니다. 누군가가이 채널 동작을 설명하기를 바랍니다. –

+0

"올바른 조건을 갖게됩니다" --- 그것이 문제의 문제입니다 : 당신은 "옳은"것이 무엇인지, 그리고 "잘못된 것"이 무엇인지를 설명하지 않았습니다. 추신 : "c", "u", "b"및 기타 쇼트닝을 사용하지 마십시오. – zerkms

답변

3
bucket := make(chan []int) 

귀하의 b 채널의 용량이이 채널에 뭔가를 보낼 때마다 채널이 즉시 가득하고, 수신기가 채널을 읽을 때까지 차단합니다 의미 0입니다.

하나 개의 주자 남아있다

은 아무도 따라서이 마지막 goroutine이 b <- bucket 줄에 영원히 갇혀 마지막 버킷을 읽을 수 있도록 bucket := <-b를 호출하려고하지, 따라서 다음 줄 c <- temp이 마지막 요구되지 않습니다 goroutine.

+0

아, 지금 보았습니다. 다른 루틴은 채널'-b'을 읽지 않으므로'b-bucket'에 영원히 붙어있을 것입니다. 그래서 프린터에서 변경했습니다. = <-c : fmt.Println (MSG) // 시간 (c 찬 [] INT, B 찬 [] INT) {위한 { 선택 { 케이스 MSG를 B 채널 'FUNC 프린터를 판독하기위한 FUNC .sleep을 (time.Second * 1) 경우 MSG = <-b : fmt.Println (MSG) } } }' –

+0

는 아주 아주 아주 많이 –

+0

감사 문제는 아무도 마지막으로 B 채널을 읽을 수 없습니다 그래서 그것은 막히거나 막을 것이다. –