방금 사용을 시작하고 첫 번째 프로그램을 작성했지만 예상대로 출력되지 않았습니다. 나는 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)
}
출력은?
goroutine이 작업을 완료하기 전에 주 스레드가 종료되기 때문에 가능할 수 있습니다. 주 기능이 끝나고 2/3 초간 잠을 자고 확인하십시오. 또한 addUrls 루틴에서 절전 모드를 제거하십시오. –
안녕하세요. .. 그게 문제 였어 .. – TheLion
[이 골란 코드에 무슨 문제가 있습니까?] (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