2016-10-29 2 views
-1

방금 ​​사용을 시작하고 첫 번째 프로그램을 작성했지만 예상대로 출력되지 않았습니다. 나는 writtern에 비동기 루틴 인 addUrl을 사용하여 url을 채널에 5000 번 추가하고 consumeUrl이 채널에서 제거하여 인쇄합니다. 루틴은 9 시간 만 실행됩니다. 왜 그럴까요? 루프가 5000 일 때Golang 루틴이 일찍 종료됩니다.

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시에 종료되는 다음 코드와 출력은

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) 
} 

출력은?

+0

goroutine이 작업을 완료하기 전에 주 스레드가 종료되기 때문에 가능할 수 있습니다. 주 기능이 끝나고 2/3 초간 잠을 자고 확인하십시오. 또한 addUrls 루틴에서 절전 모드를 제거하십시오. –

+0

안녕하세요. .. 그게 문제 였어 .. – TheLion

+1

[이 골란 코드에 무슨 문제가 있습니까?] (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

실제로 문제는 Nipun이 말했듯이, 메인은 일찍 종료되었습니다.

1

main을 기다리기 위해 time.Sleep을 사용하고 있지만 실제로는 WaitGroups를 사용해야합니다.

그런 식으로 임의의 시간을 고를 필요가 없으며 프로그램을 끝내기에 충분하거나 너무 많은 시간을 설정하는 것에 대해 걱정할 필요가 없으며 프로그램이 아무 것도하지 않고 앉아 있기를 바랍니다.

나는 여기에 코드에 WaitGroups의 구현을 추가했습니다 : 또한

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

, 당신의 consumeUrls 기능이 기록되는 방법은 적절하게 반복되지 않고, 당신은 모든 것을 얻을하지 않습니다 귀하의 채널에 인쇄했습니다. 그러나 그것은 당신의 구체적인 질문이 아니기 때문에 여기에서 다루지 않을 것입니다.

관련 문제