2016-05-12 8 views
1

私はcurrenlty learning GOです。いくつかの基本を学んだ後、私はgoroutinesを使って異なるファイルに同時にウェブページ(スライス内のURL)をダウンロードする小さなプログラムを作成しようとしていました。ここに私が書いたコードがいくつかあります:URLからファイルにダウンロードするルーチンに行く

func downloadFromUrl(url string) { 
    tokens := strings.Split(url, "/") 
    fileName := tokens[len(tokens)-1] 
    // I took out the bit that download the file for testing. 
    fmt.Println("Downloading", url, "to", fileName) 

} 

実際にテスト用のページをダウンロードしたビットをコメントアウトしました。私の主な機能では、私はこれをやっている:

func main() { 
    urls := []string{"http://www.google.com", "http://www.yahoo.com", "http://www.google.com"} 

    for _, url := range urls { 
     fmt.Println(url); 
     go downloadFromUrl(url); 
    } 
} 

問題は、私が表現go downloadFromUrl(url);を使用する場合、関数downloadFromUrlが実行されないということです。しかし、ループ内でdownloadFromUrl(url)を使用するだけでうまくいきます。私は間違って何をしていますか?ルーチンでチャンネルを使用する必要がありますか?

+1

1の可能性のある重複した[いただきました。このgolangコードと間違っ?](http://stackoverflow.com/questions/28958192/whats-wrong-with-this-golang-code)2. [ゴルーチンはありませんtime.Sleepが含まれていれば実行しない](http://stackoverflow.com/questions/28307783/goroutine-does-not-execute-if-time-sleep-included) – icza

答えて

5

問題はゴルーチンが返される前に主に終了しますが、最も簡単な解決策はsync.WaitGroupです。

func main() { 
    urls := []string{"http://www.google.com", "http://www.yahoo.com", "http://www.google.com"} 
    var wg sync.WaitGroup 
    for _, url := range urls { 
     wg.Add(1) 
     log.Println(url) 
     go downloadFromUrl(url, &wg) 
    } 
    wg.Wait() 
} 

func downloadFromUrl(url string, wg *sync.WaitGroup) { 
    defer wg.Done() 
    .... 
} 
+0

ありがとう、これは私のために働く。どのように動作するのか説明できますか?適切な文書を参照してください。ありがとう。 – awm

+0

@awm 'go func()'をバックグラウンドで実行すると実行が続行されるので、main()は基本的に終了しません。待機グループを使用すると、メインが強制的に待機します。 – OneOfOne

関連する問題