php小編柚子提醒您,使用Sync Map可能會導致RAM和goroutine的增加。 Sync Map是Go語言中用來實現並發安全的映射資料結構的函式庫。雖然它在處理並發讀寫時提供了高效的效能,但是在大規模資料處理時,使用Sync Map可能會導致記憶體佔用和goroutine數量的增加。因此,在使用Sync Map時,需要根據特定業務場景和需求,權衡使用與效能之間的平衡,以確保系統的穩定性和高效性。
您好,這是我將 util 稱為收集器的程式碼
import ( "context" "errors" "sync" "time" ) type Collector struct { keyValMap *sync.Map } func (c *Collector) LoadOrWait(key any) (retValue any, availability int, err error) { value, status := c.getStatusAndValue(key) switch status { case 0: return nil, 0, nil case 1: return value, 1, nil case 2: ctxWithTimeout, _ := context.WithTimeout(context.Background(), 5 * time.Second) for { select { case <-ctxWithTimeout.Done(): return nil, 0, errRequestTimeout default: value, resourceStatus := c.getStatusAndValue(key) if resourceStatus == 1 { return value, 1, nil } time.Sleep(50 * time.Millisecond) } } } return nil, 0, errRequestTimeout } // Store ... func (c *Collector) Store(key any, value any) { c.keyValMap.Store(key, value) } func (c *Collector) getStatusAndValue(key any) (retValue any, availability int) { var empty any result, loaded := c.keyValMap.LoadOrStore(key, empty) if loaded && result != empty { return result, 1 } if loaded && result == empty { return empty, 2 } return nil, 0 }
因此該實用程式的目的是充當緩存,其中相似的值僅加載一次但讀取多次。然而,當 collector 的物件傳遞給多個 goroutine 時,只要多個 goroutine 嘗試使用收集器緩存,我就會面臨 gorotine 和 ram 使用量的增加。有人可以解釋一下同步地圖的這種用法是否正確。如果是,那麼可能是什麼原因導致goroutine 數量多/記憶體使用率高
當然,由於沒有呼叫新建立的ctxwithtimeout
上下文的取消函數,您可能會面臨記憶體洩漏。為了解決這個問題,請將該行更改為:
ctxWithTimeout, cancelFunc := context.WithTimeout(context.Background(), requestTimeout) defer cancelFunc()
因此,一旦上下文過期,您始終可以清除分配的所有資源。這應該可以解決洩漏問題。
關於 sync.map
的用法對我來說似乎很好。
如果這解決了您的問題或還有其他問題需要解決,請告訴我,謝謝!
以上是Sync Map 可能會導致 ram 和 goroutine 的增加的詳細內容。更多資訊請關注PHP中文網其他相關文章!