2 回答

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊
Craigslist 也可能只是限制你的速度。無(wú)論哪種方式,我建議將并發(fā)請(qǐng)求限制在 20 個(gè)左右,這里是對(duì)您的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)
該應(yīng)用程序應(yīng)該仍然非常快。我也同意對(duì)你的問(wèn)題的其他評(píng)論。也會(huì)盡量避免在全球范圍內(nèi)投入太多。
您還可以通過(guò)僅使用請(qǐng)求池中的等待組來(lái)稍微修飾我的更改,并讓每個(gè) goroutine 自行清理并減少等待組。這將限制一些全球范圍。

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
像許多人建議的那樣刪除了全局 WaitGroup 并將其作為參數(shù)(指針)傳入以清理代碼。至于之前的報(bào)錯(cuò)問(wèn)題,肯定是像maxm說(shuō)的maxm HTTP request max out了。一旦我在每 20 次搜索之間添加一個(gè)等待,我就沒有看到任何錯(cuò)誤。該程序的運(yùn)行速度比我希望的要慢一些,但出于學(xué)習(xí)目的,這很有幫助。
以下是所需代碼的主要更改。
? ? ? ? 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 關(guān)注
- 146 瀏覽
添加回答
舉報(bào)