首頁 >後端開發 >Golang >Sync Map 可能會導致 ram 和 goroutine 的增加

Sync Map 可能會導致 ram 和 goroutine 的增加

PHPz
PHPz轉載
2024-02-09 18:15:08846瀏覽

Sync Map 可能会导致 ram 和 goroutine 的增加

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除