2017-04-01 64 views
-2

我做了這個簡單的代碼,試圖瞭解如何爲頻道的作品,不知何故,如果發送通道B之後發送通道c,在過去的常規通道沒有被髮送,它是一個通道OPS影響到另一個通道OPS

我有2個通道,通道c用於將通道b分成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,你會有合適的條件,這是我不明白的,我希望有人會解釋這個頻道的行爲 –

+0

「你會有合適的條件」 ---這是問題的問題:你沒有解釋什麼是「正確」,什麼是「錯誤」。 PS:請儘量避免使用「c」,「u」,「b」和其他縮寫。 – zerkms

回答

3
bucket := make(chan []int) 

b通道的容量爲0.這意味着只要您送東西給這個通道,該通道是立即全面和將阻塞,直到接收器讀取信道。

當只有一個亞軍離開,沒有人會打電話bucket := <-b閱讀最後一個桶,因此這最後的goroutine被永遠困在b <- bucket線,因此下一行c <- temp將永遠不會被調用這最後夠程。

+0

Ahhh我現在看到,沒有其他例程讀取通道'<-b',所以它會永久卡在'b < - bucket',所以然後我在打印機上做了更改FUNC用於讀取b通道 'FUNC打印機(C瓚[] INT,b瓚[] INT){ 爲{ 選擇{ 情況下消息:= <-c: fmt.Println(MSG) //時間。睡眠(time.Second * 1) 情況下消息:= <-b: fmt.Println(MSG) } } }' –

+0

謝謝非常非常非常 –

+0

問題沒有人讀取的最後一個b通道所以它會卡住或阻止 –

相關問題