1

GoColly 执行网络请求的默认模式是什么?由于我们Async在收集器中有方法,我假设默认模式是同步的。但是,当我在程序中执行这 8 个请求时,除了我需要Wait用于异步模式之外,我看不出有什么特别的区别。似乎该方法仅控制程序的执行方式(其他代码)并且请求始终是异步的。

package main

import (
    "fmt"

    "github.com/gocolly/colly/v2"
)

func main() {

    urls := []string{
        "http://webcode.me",
        "https://example.com",
        "http://httpbin.org",
        "https://www.perl.org",
        "https://www.php.net",
        "https://www.python.org",
        "https://code.visualstudio.com",
        "https://clojure.org",
    }

    c := colly.NewCollector(
        colly.Async(true),
    )

    c.OnHTML("title", func(e *colly.HTMLElement) {
        fmt.Println(e.Text)
    })

    for _, url := range urls {

        c.Visit(url)
    }

    c.Wait()
}
4

1 回答 1

1

默认集合同步的。

令人困惑的位可能是colly.Async()忽略实际参数的收集器选项。实际上在撰写本文时的实现是:

func Async(a ...bool) CollectorOption {
    return func(c *Collector) {
        c.Async = true // uh-oh...!
    }
}

基于这个问题,这样做是为了向后兼容,所以(我相信)你可以传递一个没有参数的选项,它仍然可以工作,例如:

colly.NewCollector(colly.Async()) // no param, async collection

如果您完全删除 async 选项并使用 just 实例化colly.NewCollector(),网络请求将明显是顺序的——即您也可以删除c.Wait()并且程序不会立即退出。

于 2022-01-24T07:58:59.880 回答