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
istStarting 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?
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. –
Hey danke .. Das war das Problem .. – TheLion
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