第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

在 sync.Map 中加載或存儲而無需每次都創(chuàng)建新結(jié)構(gòu)

在 sync.Map 中加載或存儲而無需每次都創(chuàng)建新結(jié)構(gòu)

Go
皈依舞 2023-03-21 15:30:15
是否可以在不每次都創(chuàng)建新結(jié)構(gòu)的情況下LoadOrStore進入圍棋?sync.Map如果沒有,有哪些替代方案可用?這里的用例是,如果我將 用作sync.Map緩存,其中緩存未命中很少見(但可能),并且在我想添加到地圖的緩存未命中時,我需要在每次調(diào)用時初始化一個結(jié)構(gòu),而LoadOrStore不僅僅是在需要時創(chuàng)建結(jié)構(gòu)。我擔(dān)心這會傷害 GC,初始化數(shù)十萬個不需要的結(jié)構(gòu)。在 Java 中,這可以使用computeIfAbsent.
查看完整描述

3 回答

?
偶然的你

TA貢獻(xiàn)1841條經(jīng)驗 獲得超3個贊

你可以試試:


var m sync.Map

s, ok := m.Load("key")

if !ok {

    s, _ = m.LoadOrStore("key", "value")

}


fmt.Println(s)

播放演示


查看完整回答
反對 回復(fù) 2023-03-21
?
白衣非少年

TA貢獻(xiàn)1155條經(jīng)驗 獲得超0個贊

這是我的解決方案:使用 sync.Map 和 sync.One


type syncData struct {

    data interface{}

    once *sync.Once

}


func LoadOrStore(m *sync.Map, key string, f func() (interface{}, error)) (interface{}, error) {

    temp, _ := m.LoadOrStore(key, &syncData{

        data: nil,

        once: &sync.Once{},

    })

    d := temp.(*syncData)

    var err error

    if d.data == nil {

        d.once.Do(func() {

            d.data, err = f()

            if err != nil {

                //if failed, will try again by new sync.Once

                d.once = &sync.Once{}

            }

        })

    }

    return d.data, err

}


查看完整回答
反對 回復(fù) 2023-03-21
?
慕俠2389804

TA貢獻(xiàn)1719條經(jīng)驗 獲得超6個贊

包同步

import "sync"

類型地圖

Map 就像 Go 的 map[interface{}]interface{} 但對于多個 goroutines 的并發(fā)使用是安全的,無需額外的鎖定或協(xié)調(diào)。加載、存儲和刪除以攤銷的常數(shù)時間運行。

Map 類型是專門的。大多數(shù)代碼應(yīng)該使用普通的 Go 地圖,使用單獨的鎖定或協(xié)調(diào),以獲得更好的類型安全性,并且更容易維護其他不變量以及地圖內(nèi)容。

Map 類型針對兩種常見用例進行了優(yōu)化:(1) 當(dāng)給定鍵的條目只寫入一次但讀取多次時,如在只會增長的緩存中,或 (2) 當(dāng)多個 goroutine 讀取、寫入和讀取時覆蓋不相交的鍵集的條目。在這兩種情況下,與 Go map 與單獨的 Mutex 或 RWMutex 配對相比,使用 Map 可以顯著減少鎖爭用。

解決這些問題的通常方法是構(gòu)建一個使用模型,然后對其進行基準(zhǔn)測試。


例如,因為“高速緩存未命中是罕見的”,假設(shè)Loadwiil 大部分時間都可以工作,并且只LoadOrStore在必要時(通過值分配和初始化)工作。


$ go test map_test.go -bench=. -benchmem

BenchmarkHit-4     2     898810447 ns/op        44536 B/op        1198 allocs/op

BenchmarkMiss-4    1    2958103053 ns/op    483957168 B/op    43713042 allocs/op

$

map_test.go:


package main


import (

    "strconv"

    "sync"

    "testing"

)


func BenchmarkHit(b *testing.B) {

    for N := 0; N < b.N; N++ {

        var m sync.Map

        for i := 0; i < 64*1024; i++ {

            for k := 0; k < 256; k++ {


                // Assume cache hit

                v, ok := m.Load(k)

                if !ok {

                    // allocate and initialize value

                    v = strconv.Itoa(k)

                    a, loaded := m.LoadOrStore(k, v)

                    if loaded {

                        v = a

                    }

                }

                _ = v


            }

        }

    }

}


func BenchmarkMiss(b *testing.B) {

    for N := 0; N < b.N; N++ {

        var m sync.Map

        for i := 0; i < 64*1024; i++ {

            for k := 0; k < 256; k++ {


                // Assume cache miss

                // allocate and initialize value

                var v interface{} = strconv.Itoa(k)

                a, loaded := m.LoadOrStore(k, v)

                if loaded {

                    v = a

                }

                _ = v


            }

        }

    }

}


查看完整回答
反對 回復(fù) 2023-03-21
  • 3 回答
  • 0 關(guān)注
  • 205 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號