大家好,我正在從 Python3 轉(zhuǎn)到 Go,所以我正在嘗試重寫我創(chuàng)建的庫以獲得更好的性能。我面臨一個問題,因?yàn)槲沂?Golang XD 中的新手,我使用有限的 API 下載數(shù)百個 json,我想盡可能少地使用請求。所以在下載那些 jsons 時,一些使用的 URL 是重復(fù)的,我得到的第一個想法是在我的下載函數(shù)(goroutines)和每個 goroutine 之間傳遞一個 map[stringLink]*myJsonReceived 在下載之前檢查鏈接是否已經(jīng)被另一個 goroutine 處理,因此與其再次請求它并浪費(fèi)帶寬 + API 調(diào)用,不如等待其他 goroutine 完成下載并從字典中獲取它。我有幾個選擇:1) goroutine 必須檢查鏈接是否在地圖中,如果是的話,它每 0.05 秒檢查一次字典中的指針是否仍然為零或包含 json。(可能是最糟糕的方法,但它有效)2) 將 goroutine 之間傳遞的映射更改為 (map[stringlink]chan myjson) 這可能是最有效的方式,但我不知道如何將單個消息發(fā)送到通道并由多個等待的 Goroutine 接收它。3)我可以通過向結(jié)構(gòu)添加一個計(jì)數(shù)器來使用選項(xiàng)(2),并且每次 goroutine 發(fā)現(xiàn)已經(jīng)請求了 url 時,它只是將 +1 添加到計(jì)數(shù)器并等待來自通道的響應(yīng),當(dāng)下載 goroutine完成后,它將向通道發(fā)送 X 條消息。但是這種方式會讓我在地圖上添加太多的鎖,這是一種性能浪費(fèi)。注意:我需要在所有函數(shù)執(zhí)行結(jié)束時使用地圖將下載的 Json 保存到我的數(shù)據(jù)庫中,以免再次下載它們。預(yù)先感謝大家的幫助。
1 回答

哈士奇WWW
TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個贊
我想解決你的任務(wù)的是我會為此使用一個 goroutine 池。將有一個生產(chǎn)者在通道上發(fā)送 URL,而工作 goroutine 將在該通道上范圍內(nèi)接收要處理(獲?。┑?URL。一旦 URL 被“完成”,同一個 worker goroutine 也可以將其保存到數(shù)據(jù)庫中,或者將結(jié)果傳遞到“collector”goroutine 的結(jié)果通道上,如果需要,它可以按順序完成保存。
這種設(shè)計(jì)結(jié)構(gòu)確保通道上發(fā)送的每個 URL 僅由一個工作 goroutine 接收,因此您不需要任何其他同步(在使用共享地圖的情況下您需要)。
Go 更喜歡 goroutines(通道)之間的通信而不是共享變量。
不要通過共享內(nèi)存進(jìn)行通信;相反,通過通信共享內(nèi)存。
- 1 回答
- 0 關(guān)注
- 141 瀏覽
添加回答
舉報
0/150
提交
取消