2017-05-02 28 views
0

我試圖寫入頻道作爲goroutine函數中的最後一個操作。在寫入頻道時延遲從未打電話

不幸的是,這是行不通的。而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 
    } 
} 

當更換c <- item.Titlefmt.Println(item.Title)遞延函數被調用和DONE被打印。

+5

你沒有什麼從'C'接收。 – JimB

+2

爲了詳細說明@JimB的評論,所有你的go-routines在'c < - item.Title'上被阻塞,因爲沒有任何東西正在讀取頻道,所以他們永遠不會完成,延遲也不會被調用,所以主要的塊等待'WaitGroup'。 – RayfenWindspear

+1

@MarcelCliff和你添加之後 - 'c'永遠不會關閉,所以'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) 
}