2017-05-02 17 views
0

私はゴルーチン関数の最後のアクションとしてチャンネルに書き込もうとしています。チャンネルに書き込むときにDeferが呼び出されない

残念ながら、これは機能しません。そして、waitGroupは決して行われません。

import (
    "sync" 
    "github.com/SlyMarbo/rss" 
    "fmt" 
) 

func main() { 
    urls := []string{"http://rss.cnn.com/rss/edition.rss", "http://rss.time.com/web/time/rss/top/index.xml"} 

    var c = make(chan string) 
    var wg sync.WaitGroup 
    for _, url := range urls { 
     wg.Add(1) 
     go receiveRss(url, &wg, c) 
    } 
    wg.Wait() 
    fmt.Println("==============DONE=================") 
} 

func receiveRss(url string, wg *sync.WaitGroup, c chan string) { 
    defer wg.Done() 
    feed, err := rss.Fetch(url) 
    if err != nil { 
     fmt.Println("Failed to retrieve RSS feed", err) 
    } 

    items := feed.Items 
    for _, item := range items { 
     c <- item.Title 
    } 
} 

fmt.Println(item.Title)c <- item.Titleと呼ば行われる遅延機能を置き換える印刷されます。

+5

あなたがC ' 'からの受信は何もありません。 – JimB

+2

@JimBのコメントを詳述するために、チャンネルから何も読んでいないので、完了しないでdeferが呼び出されることはないので、すべてのあなたのgo-routinesは 'c RayfenWindspear

+1

@MarcelCliffを追加した後、 'c'は決して閉じられません。' for title:= range c'は永遠にブロックされます。 – zerkms

答えて

0

問題は、私がチャンネルに書き込むことだけだったということです。それから読んではいけない。 これを実行しないと、チャンネルは役に立たなくなります。

これに対する解決策は次のとおりです。ゴルーチンを起動ループの後にチャネルからの読み取り

for title := range c { 
    fmt.Println(title) 
} 

チャネルがクローズされることはありません場合、これはその後、無限ループが発生します。 だから私はちょうどそれに書き込んだ後、チャンネルを閉じる:ここ

close(c) 

は、全体のコードです:

func main() { 

    urls := []string{"http://rss.cnn.com/rss/edition.rss", "http://rss.time.com/web/time/rss/top/index.xml"} 

    var c = make(chan []string) 
    var wg sync.WaitGroup 

    for _, url := range urls { 
     wg.Add(1) 
     go receiveRss(url, &wg, c) 
    } 
    for title := range c { 
     fmt.Println(title) 
    } 
    wg.Wait() 
    fmt.Println("==============DONE=================") 
} 

func receiveRss(url string, wg *sync.WaitGroup, c chan []string) { 
    defer wg.Done() 
    feed, err := rss.Fetch(url) 
    if err != nil { 
     fmt.Println("Failed to retrieve RSS feed", err) 
    } 

    items := feed.Items 
    var titles []string 
    for _, item := range items { 
     titles = append(titles, item.Title) 
    } 
    c <- titles 
    close(c) 
} 
関連する問題