亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我如何等待對多個其他 Goroutines 的單個 Goroutine 響應?

我如何等待對多個其他 Goroutines 的單個 Goroutine 響應?

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

1 回答

?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

我想解決你的任務的是我會為此使用一個 goroutine 池。將有一個生產者在通道上發送 URL,而工作 goroutine 將在該通道上范圍內接收要處理(獲取)的 URL。一旦 URL 被“完成”,同一個 worker goroutine 也可以將其保存到數據庫中,或者將結果傳遞到“collector”goroutine 的結果通道上,如果需要,它可以按順序完成保存。

這種設計結構確保通道上發送的每個 URL 僅由一個工作 goroutine 接收,因此您不需要任何其他同步(在使用共享地圖的情況下您需要)。

Go 更喜歡 goroutines(通道)之間的通信而不是共享變量。

不要通過共享內存進行通信;相反,通過通信共享內存。

查看完整回答
反對 回復 2023-06-12
  • 1 回答
  • 0 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號