我正在進(jìn)行巡回演出,我覺(jué)得除了并發(fā)以外,我對(duì)語(yǔ)言有了很好的理解。在幻燈片72上,有一個(gè)練習(xí),要求讀者并行化Web爬網(wǎng)程序(并使其不覆蓋重復(fù)的內(nèi)容,但我還沒(méi)有到達(dá)那里。)這是我到目前為止的內(nèi)容:func Crawl(url string, depth int, fetcher Fetcher, ch chan string) { if depth <= 0 { return } body, urls, err := fetcher.Fetch(url) if err != nil { ch <- fmt.Sprintln(err) return } ch <- fmt.Sprintf("found: %s %q\n", url, body) for _, u := range urls { go Crawl(u, depth-1, fetcher, ch) }}func main() { ch := make(chan string, 100) go Crawl("http://golang.org/", 4, fetcher, ch) for i := range ch { fmt.Println(i) }}我的問(wèn)題是在哪里close(ch)打電話。如果我defer close(ch)在Crawl方法中的某處放置了一個(gè)對(duì)象,那么我最終會(huì)在其中一個(gè)生成的goroutine中寫(xiě)入一個(gè)封閉的通道,因?yàn)樵摲椒▽⒃谏傻膅oroutine之前完成執(zhí)行。如果我省略了對(duì)close(ch)代碼的調(diào)用,如我的示例代碼所示,則在所有g(shù)oroutine完成執(zhí)行后,程序?qū)⑺梨i,但主線程仍在for循環(huán)中的通道上等待,因?yàn)樵撏ǖ缽奈搓P(guān)閉過(guò)。
Go Tour爬蟲(chóng)運(yùn)動(dòng)帶來(lái)的麻煩
BIG陽(yáng)
2021-05-10 10:24:38