2012-09-12 6 views
6

Ich versuche, ein einfaches Programm zu erstellen, um Kanäle in Go zu lernen. Aber ich bin in zu einem Deadlock Fehler läuft, die ich"alle goroutines sind schlafend - Deadlock! Exit Status 2" Fehler in einem Drucker-Empfänger-Programm

package main 

import (
    "fmt" 
    "time" 
) 

func printer(c chan int) { 
    for i := 0; i < 10; i++ { 
     c <- i 
     time.Sleep(time.Second) 
    } 
} 

func reciever(c chan int) { 
    for { 
     recievedMsg := <-c 
     fmt.Println(recievedMsg) 
    } 
} 

func main() { 
    newChanel := make(chan int) 
    printer(newChanel) 
    reciever(newChanel) 
} 

Meine ersten Gedanken herauszufinden, kann nicht etwas über die Sleep-Funktion, aber selbst wenn ich das DO NOT füge ich noch in diesem Lauf Fehler und beenden Sie die Nachricht. Kann jemand einige Hinweise geben, wie man das löst?

Vielen Dank im Voraus

Antwort

8

Sie benötigen zwei Threads Ausführung, denn jetzt gibt es keine Möglichkeit für die reciever Funktion aufgerufen werden soll, wie Sie die printer Funktion nie verlassen. Sie müssen eine davon in einer separaten Routine ausführen.

Sie sollten auch close den Kanal und verwenden Sie den range-Operator in Ihrer Schleife, so dass es endet, wenn der Kanal geschlossen ist.

So schlage ich Sie diesen Code:

func printer(c chan int) { 
    for i := 0; i < 10; i++ { 
     c <- i 
     time.Sleep(time.Second) 
    } 
    close(c) 
} 

func reciever(c chan int) { 
    for recievedMsg := range c { 
     fmt.Println(recievedMsg) 
    } 
} 

func main() { 
    newChanel := make(chan int) 
    go printer(newChanel) 
    reciever(newChanel) 
} 
+0

Dank. Ich habe es nach deinen Tipps modifiziert, und alle Zahlen von 0 - 9 druckt, aber dann bekomme ich den gleichen Fehler danach. Ich fügte auch hinzu: \t var Eingabe String fmt.Scanln (& Eingabe), aber ich bekomme den gleichen Fehler, nachdem die Zahlen gedruckt werden. Irgendeine Idee, was ich falsch mache? – miner

+0

Ich habe "Go Reciever" hinzugefügt, um den Drucker zur Routine zu machen, und druckt dann 0 - 9 ohne Fehler. – miner

+0

Ich bearbeitete genau, wie Sie den Kanal schließen und den Empfang beenden sollen, wenn der Kanal geschlossen ist. Es scheint sauberer (und wiederverwendbarer). –