Я только начал использовать go и написал свою первую программу, но результат не так ожидался. У меня есть сценарий async addUrl, который добавляет url к каналу 5000 раз и consumeUrl удаляет из канала и печатает его. Процедура работает только 9 раз. Почему это? Ниже приведен код и выходГоланская процедура заканчивается раньше
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)
}
Выход
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
Почему это заканчивается на 8 лет, когда цикл 5000?
Скорее всего, потому, что основной поток выходит до того, как горутин успел завершить свою работу. Поставьте спать 2/3 секунды в конце основной функции и проверьте. Также удалите спящий режим из процедуры addUrls. –
Эй, спасибо .. Это была проблема .. – TheLion
Возможный дубликат [Что не так с этим кодом golang?] (Http://stackoverflow.com/questions/28958192/whats-wrong-with-this-golang-code); и [Goroutine не выполняется, если включен time.Sleep] (http://stackoverflow.com/questions/28307783/goroutine-does-not-execute-if-time-sleep-included). – icza