2016-10-29 4 views
-1

Ich habe gerade angefangen zu gehen und schrieb mein erstes Programm, aber die Ausgabe ist nicht wie erwartet. Ich habe eine asynchrone Routine addUrl geschrieben, die URL 5000 Mal Kanal hinzugefügt und consumeUrl entfernt aus dem Kanal und druckt es. Die Routine läuft nur 9 Mal. Warum ist es? Unten ist der Code und AusgabeGolang Routine endet früh

package main 

import "fmt" 
import "time" 

var urlCount = 0 

func main(){ 

    urlHolder := make(chan string,5000) 

    fmt.Printf("Starting program") 

    go addUrls(urlHolder) 

    time.Sleep(time.Millisecond * 100) 
    go consumeUrls(urlHolder) 

    fmt.Printf("Done") 

} 

func addUrls(urlHolder chan string){ 
    var myurl string = "https://example.com/" 

    for i:=0; i<5000 ; i++ { 
     urlHolder<-myurl 
     fmt.Printf(" %d url added \n",i) 
     time.Sleep(time.Millisecond * 10) 
    } 

} 

func consumeUrls(urlHolder chan string) { 
    urlCount++ 
    urlsConsumed := <- urlHolder 
    fmt.Printf("Pulled url %d",urlCount," ",urlsConsumed,"\n") 
    time.Sleep(time.Millisecond * 20) 
} 

Der Ausgang

ist
Starting program 
0 url added 
1 url added 
2 url added 
3 url added 
4 url added 
5 url added 
6 url added 
7 url added 
8 url added 
Done 

Warum ist es bei 8 beendet wird, wenn Schleife 5000 ist?

+0

Wahrscheinlich, weil der Hauptthread beendet wird, bevor die Goroutine Zeit hat, ihre Arbeit abzuschließen. Legen Sie einen Schlaf von 2/3 Sekunden am Ende der Hauptfunktion und überprüfen. Entfernen Sie auch den Schlaf aus der Routine addUrls. –

+0

Hey danke .. Das war das Problem .. – TheLion

+1

Mögliche Duplikate von [Was ist los mit diesem Golang-Code?] (Http://stackoverflow.com/questions/28958192/whats-wrong-with-this-golang-code); und [Goroutine wird nicht ausgeführt, wenn time.Sleep enthalten ist] (http://stackoverflow.com/questions/28307783/gorou- te-does-not-execute-if-time-sleep-included). – icza

Antwort

-1

Eigentlich Das Problem war wie Nipun sagte, das Haupt wurde früh beendet.

1

Sie verwenden time.Sleep, um auf main zu warten, um zu beenden, aber Sie sollten WaitGroups wirklich verwenden.

So müssen Sie nicht versuchen, irgendeine willkürliche Zeit zu wählen und hoffen, dass es genug ist, damit Ihr Programm beendet wird, oder sich Sorgen über das Setzen zu viel Zeit macht und Ihr Programm rum sitzt, nichts tuend.

Ich habe die Implementierung von WaitGroups, um Ihren Code hier hinzugefügt:

https://play.golang.org/p/1zn2JYefaA

Auch die Art und Weise Ihre consumeUrls Funktion geschrieben wird, ist nicht richtig Looping und Sie werden nicht alles bekommen in deinem Kanal gedruckt. Aber da das nicht Ihre spezifische Frage war, werde ich hier nicht darauf eingehen.