2017-04-01 1 views
-2

ich diesen einfachen Code gemacht, um zu wissen versuchen, wie Kanal funktioniert ist, irgendwie, wenn Kanal c gesendet wird, nachdem Kanal b gesendet wird, Kanal in letzter Routine wird nicht gesendet werden,Ist es ein Kanal ops einen anderen Kanal ops beeinflussen

Ich habe 2 Kanäle, Kanal c ist für die Aufteilung von Kanal b auf 4 Teil der Scheibe.

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

Es ist nicht offensichtlich, was eigentlich mit diesem Code für Sie nicht klar ist. Was erwartest du zu bekommen und was bekommst du eigentlich? – zerkms

+0

Haben Sie den Code ausgeführt? überprüfen Sie bitte die Läuferfunktion, wenn Sie zuerst an Kanal c und dann an b gesendet werden, haben Sie die richtige Bedingung, das ist, was ich nicht verstehe, ich hoffe jemand würde dieses Kanalverhalten erklären –

+0

"Sie werden den richtigen Zustand haben" --- Das ist das Problem mit der Frage: Sie haben nicht erklärt, was das "Richtige" ist und was das "Falsche" ist. PS: Bitte vermeiden Sie "c", "u", "b" und andere Kürzungen. – zerkms

Antwort

3
bucket := make(chan []int) 

Ihren b Kapazität des Kanals ist 0. Das bedeutet, wenn Sie etwas zu diesem Kanal zu senden, ist der Kanal sofort voll und wird blockiert, bis ein Empfänger den Kanal liest.

Wenn nur ein Läufer übrig ist, wird niemand bucket := <-b anrufen, um den letzten Eimer zu lesen, so dass diese letzte goroutine für immer auf der b <- bucket Linie geklebt wird, und damit die c <- temp nächste Zeile wird nie für diesen letzten aufgerufen werden Goroutine.

+0

Ahhh Ich sehe jetzt, keine andere Routine lesen Sie den Kanal '<-b ', so wird es für immer auf' b <- Eimer fest, so dann habe ich am Drucker geändert func für den B-Kanal das Lesen 'func Drucker (c chan [] int, B chan [] int) { für { select { Fall msg: = <-c: fmt.Println (msg) // Zeit .Sleep (time.Second * 1) Fall msg: = <-b: fmt.Println (msg) } } } ' –

+0

Danke sehr sehr sehr viel –

+0

das Problem gelesen wird niemand den letzten b Kanal so wird es stecken bleiben oder blockieren –

Verwandte Themen