为了账号安全,请及时绑定邮箱和手机立即绑定

多个Http.Get随机挂起

多个Http.Get随机挂起

Go
Helenr 2023-04-17 16:28:24
我正在尝试学习 Golang 并进行了一个简单的项目来调用所有 craigslist 城市并查询它们以进行特定搜索。在下面的代码中,我删除了 listingmap 中的所有链接,但那里有超过 400 个链接。所以循环相当大。我认为这将是一个很好的测试,可以将我所学的知识付诸应用,但我遇到了一个奇怪的问题。有时大多数 Http.Get() 都得不到服务器的响应,而其他时候则毫无问题地获得所有响应。所以我开始添加打印件来显示有多少错误我们恢复了,有多少成功通过了。此外,在运行时它会随机挂起并且从不响应。该程序不会冻结,但该站点只是坐在那里尝试加载并且终端没有显示任何活动。我通过在恢复后推迟清理来确保我的响应主体已关闭,但它似乎仍然不起作用。有没有什么东西让任何人跳出来,也许我错过了?提前谢谢大家!
查看完整描述

2 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

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 自行清理并减少等待组。这将限制一些全球范围。


查看完整回答
反对 回复 2023-04-17
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

像许多人建议的那样删除了全局 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++

    }


查看完整回答
反对 回复 2023-04-17
  • 2 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信