2 回答

TA貢獻1877條經(jīng)驗 獲得超6個贊
Craigslist 也可能只是限制你的速度。無論哪種方式,我建議將并發(fā)請求限制在 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)
該應用程序應該仍然非??臁N乙餐鈱δ愕膯栴}的其他評論。也會盡量避免在全球范圍內(nèi)投入太多。
您還可以通過僅使用請求池中的等待組來稍微修飾我的更改,并讓每個 goroutine 自行清理并減少等待組。這將限制一些全球范圍。

TA貢獻1818條經(jīng)驗 獲得超11個贊
像許多人建議的那樣刪除了全局 WaitGroup 并將其作為參數(shù)(指針)傳入以清理代碼。至于之前的報錯問題,肯定是像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 關注
- 158 瀏覽
添加回答
舉報