2016-10-29 4 views
-1

Я только начал использовать 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?

+0

Скорее всего, потому, что основной поток выходит до того, как горутин успел завершить свою работу. Поставьте спать 2/3 секунды в конце основной функции и проверьте. Также удалите спящий режим из процедуры addUrls. –

+0

Эй, спасибо .. Это была проблема .. – TheLion

+1

Возможный дубликат [Что не так с этим кодом 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

ответ

-1

На самом деле Проблема была такой, как Нипун сказал, что главный разорвался рано.

1

Вы используете time.Sleep, чтобы подождать main, но вы действительно должны использовать WaitGroups.

Таким образом, вам не нужно пытаться выбрать какое-то произвольное время и надеяться, что этого достаточно, чтобы ваша программа закончилась, или беспокоиться о том, чтобы установить слишком много времени, и ваша программа сидит вокруг, ничего не делая.

Я добавил реализацию WaitGroups в код здесь:

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

Кроме того, как ваша consumeUrls функция написана не обхвата должным образом, и вы не получите все в вашем канале. Но так как это был не ваш конкретный вопрос, я не буду рассматривать его здесь.

Смежные вопросы