多个Http.Get随机挂起

我正在尝试学习 Golang 并进行了一个简单的项目来调用所有 craigslist 城市并查询它们以进行特定搜索。在下面的代码中,我删除了 listingmap 中的所有链接,但那里有超过 400 个链接。所以循环相当大。我认为这将是一个很好的测试,可以将我所学的知识付诸应用,但我遇到了一个奇怪的问题。

有时大多数 Http.Get() 都得不到服务器的响应,而其他时候则毫无问题地获得所有响应。所以我开始添加打印件来显示有多少错误我们恢复了,有多少成功通过了。此外,在运行时它会随机挂起并且从不响应。该程序不会冻结,但该站点只是坐在那里尝试加载并且终端没有显示任何活动。

我通过在恢复后推迟清理来确保我的响应主体已关闭,但它似乎仍然不起作用。有没有什么东西让任何人跳出来,也许我错过了?

提前谢谢大家!


Helenr
浏览 92回答 2
2回答

慕哥9229398

Craigslist 也可能只是限制你的速度。无论哪种方式,我建议将并发请求限制在 20 个左右,这里是对您的listingAggHandler.queue := make(chan Listings, 99999)listing_map := make(map[string]Listing)request_queue := make(chan string)for i := 0; i < 20; i++ {    go func() {        for {            key := <- request_queue            cityRoutine(queue, key)                        }    }()}for key, _ := range locationMap {    wg.Add(1)    request_queue <- key}wg.Wait()close(request_queue)close(queue)该应用程序应该仍然非常快。我也同意对你的问题的其他评论。也会尽量避免在全球范围内投入太多。您还可以通过仅使用请求池中的等待组来稍微修饰我的更改,并让每个 goroutine 自行清理并减少等待组。这将限制一些全球范围。

慕尼黑8549860

像许多人建议的那样删除了全局 WaitGroup 并将其作为参数(指针)传入以清理代码。至于之前的报错问题,肯定是像maxm说的maxm HTTP request max out了。一旦我在每 20 次搜索之间添加一个等待,我就没有看到任何错误。该程序的运行速度比我希望的要慢一些,但出于学习目的,这很有帮助。以下是所需代码的主要更改。        counter := 0    for key, _ := range locationMap {        if(counter >= 20) {            wg.Wait()            counter = 0        }        wg.Add(1)        frmtSearch := key + "search/sss?format=rss&query=" + strings.Replace(p.SearchRequest, " ", "%20", -1)        go cityRoutine(queue, frmtSearch, &wg)        counter++    }
打开App,查看更多内容
随时随地看视频慕课网APP