2017-04-01 1 views
-2

別のチャネルOPSに影響を与えるですは、その一つのチャネルOPSは、チャンネルBが送信された後、チャネルcが最後のルーチンでは、チャネルが送信されていない、送信された何とか場合、チャネル作品だ方法を知ってしようと、私はこの単純なコードを作っ

私は2つのチャンネルを持っています、チャンネルは、4つの部分のスライスにチャネルを分割するためのものです。

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

" ---それは問題の問題です。あなたは「正しい」ものが何か、そして「間違っている」ものは何かを説明していません。 PS: "c"、 "u"、 "b"などのショートニングを避けてください。 – zerkms

答えて

3
bucket := make(chan []int) 

あなたbチャネルの容量は0です。これは、あなたがこのチャンネルに何かを送る時はいつでも、チャンネルがすぐに一杯になると、受信機がチャネルを読み取るまでブロックされることを意味します。

左に一つだけのランナーがある場合、誰がため、この最後のゴルーチンがb <- bucketライン上に永遠に立ち往生しているので、次の行c <- tempは、この最後のために呼び出されることはありません、最後のバケットを読み取るためにbucket := <-bを呼び出すために行くされていませんゴルーチン

+0

ああ、私は今見て、他のルーチンはチャネル '<-b'を読んでいないので、それは永久に' b < - bucket'で止まるでしょう。 = <-c: fmt.Println(MSG) //時間{ {ケースを選択するためのMSG Bチャネル 'FUNCプリンタ(Cちゃん[] INT、チャンB [] INT){ を読み取るFUNC .Sleep(time.Second * 1) ケースMSG:= <-b: fmt.Println(MSG) } } } ' –

+0

問題は誰が最後のBチャネルを読まないで非常に非常に非常に多くの –

+0

をありがとうそれはスタックまたはブロックされます –

関連する問題