2 回答
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 自行清理并减少等待组。这将限制一些全球范围。
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++
}
- 2 回答
- 0 关注
- 110 浏览
添加回答
举报