代码之家  ›  专栏  ›  技术社区  ›  Jan Bodnar

GoColly的默认模式是什么,同步还是异步?

  •  0
  • Jan Bodnar  · 技术社区  · 3 年前

    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()
    }
    
    0 回复  |  直到 3 年前
        1
  •  1
  •   blackgreen VonC    3 年前

    默认集合 同步的

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

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

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

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

    如果您完全删除async选项,并使用 colly.NewCollector() ,网络请求将明显按顺序排列,即您也可以删除 c.Wait() 程序不会立即退出。

    推荐文章