【问题标题】:How to print the results from a concurrent and recursive function? [closed]如何打印并发和递归函数的结果? [关闭]
【发布时间】:2012-09-01 05:51:12
【问题描述】:

我一直在进行 go tour,并且我已经完成了网络爬虫练习,但我认为我用来打印所有结果的技术可能效率低下。

这是我的代码。我只编辑了抓取和主要功能,所以我将发布它。这是练习的链接(http://tour.golang.org/#70

    var used = make(map[string]bool)

    func Crawl(url string, depth int, fetcher Fetcher, results chan string) {
        if depth <= 0 {
            return
        }
        body, urls, err := fetcher.Fetch(url)
        if err != nil {
            results <- fmt.Sprintf("%v",err)
            return
        }
        results <-fmt.Sprintf("\nfound: %s %q\n", url, body)
        for _,u := range urls {
            if used[u] == false {
                used[u] = true
                go Crawl(u, depth-1, fetcher, results)
            }
        }
        return
    }
    //------------------------------------------------------------
    func main() {
        used["http://golang.org/"] = true
        results := make(chan string)
        go Crawl("http://golang.org/", 4, fetcher, results)
        for i := 0; i < len(used); i++ {
            fmt.Println(<-results)
        }
    }

我在 main 中使用“for i

    for i := range results

因为它是递归的,所以很难在爬取函数中使用“close(results)”,但是按照我这样做的方式,我必须找到每次使用的变量的长度。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: concurrency for-loop go


    【解决方案1】:

    要等待一组 goroutine 完成,请使用 sync.WaitGroup.

    相信你会发现官方文档中的例子非常熟悉..

    http://golang.org/pkg/sync/#example_WaitGroup

    引用:

    var wg sync.WaitGroup
    变种网址 = []字符串{
        "http://www.golang.org/",
        "http://www.google.com/",
        "http://www.somestupidname.com/",
    }
    对于_,网址:=范围网址{
        // 增加 WaitGroup 计数器。
        wg.Add(1)
        // 启动一个 goroutine 来获取 URL。
        去 func(url 字符串) {
            // 获取网址。
            http.Get(网址)
            // 递减计数器。
            wg.Done()
        }(网址)
    }
    // 等待所有 HTTP 获取完成。
    wg.Wait()
    

    这将阻塞直到所有工作完成。

    如果您真的想在收集结果时逐步打印结果,最简单的方法是在 fetcher 本身中进行。

    【讨论】:

      猜你喜欢
      • 2021-03-18
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2020-03-17
      相关资源
      最近更新 更多