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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Go 中對(duì)單個(gè)計(jì)算資源的多個(gè)請(qǐng)求

Go 中對(duì)單個(gè)計(jì)算資源的多個(gè)請(qǐng)求

Go
翻翻過去那場(chǎng)雪 2023-08-14 14:53:53
尋找更 Go 式的解決方案來解決以下問題:假設(shè)服務(wù)器有多個(gè)并行傳入請(qǐng)求,要求使用 key 的資源key。由于計(jì)算此資源非常昂貴/耗時(shí),因此我們希望確保僅計(jì)算一次。有無限多個(gè)可能的鍵。一種簡(jiǎn)單的實(shí)現(xiàn):if hasCachedValue(key) {   return cachedValue(key)}if somebodyElseWorkingOn(key) {   waitUntilReady(key)} else {   buildCacheValue(key) // time consuming}return cachedValue(key)到目前為止,我們已經(jīng)使用共享解決了這個(gè)問題map[string]chan bool,其中第一個(gè)請(qǐng)求插入了 chan for key,而后續(xù)請(qǐng)求在值準(zhǔn)備好時(shí)等待該 chan 的關(guān)閉。為了保護(hù)地圖,我們使用了sync.Mutex,但我們感覺有一個(gè)更好、更 Go 式的解決方案。
查看完整描述

3 回答

?
波斯汪

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊

使用單程套餐。為該組聲明一個(gè)包級(jí)變量:

var?g?singleflight.Group

使用以下代碼獲取值:

v, err, _ := g.Do(key, func() (interface{}, error) {

? ? if !hasCachedValue(key) {

? ? ? ? buildCacheValue(key)

? ? }

? ? return cachedValue(key), nil

})

if err != nil {

? ? // handle error

}

x := v.(valueType) // assert to type returned by cachedValue

// do something with x


查看完整回答
反對(duì) 回復(fù) 2023-08-14
?
肥皂起泡泡

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

這是一個(gè)簡(jiǎn)單的代碼,可以完成您想要的操作。我測(cè)試了它,它工作沒有問題。Go 競(jìng)爭(zhēng)條件檢查器沒有檢測(cè)到任何問題。


type Cache struct {

    mtx sync.RWMutex

    m map[KeyType]*CacheValue

}


type CacheValue struct {

    val *ValueType

    mtx sync.Mutex

}


func NewCache() *Cache {

    return &Cache{m: make(map[KeyType]*CacheValue)}

}


func (c *Cache) Get(key KeyType) *ValueType {

    c.mtx.RLock()

    v := c.m[key]

    c.mtx.RUnlock()

    if v != nil {

        v.mtx.Lock()

        x := v.val

        v.mtx.Unlock()

        if x != nil {

            return x

        }

    }


    if v == nil {

        c.mtx.Lock()

        v = c.m[key]

        if v == nil {

            v = &CacheValue{}

            c.m[key] = v

        }

        c.mtx.Unlock()

    }


    v.mtx.Lock()

    if v.val == nil {

        v.val = buildValue(key)

    }

    v.mtx.Unlock()

    return v.val

}


查看完整回答
反對(duì) 回復(fù) 2023-08-14
?
梵蒂岡之花

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個(gè)贊

受到經(jīng)常用于描述通道的乒乓球示例的啟發(fā),我們嘗試了僅通道方法。球保存有關(guān)正在生成的密鑰的狀態(tài),并且球在共享通道的請(qǐng)求之間傳遞:


import "time"


var table = make(chan map[string]chan bool)


func keeper() {

    for {

        ball := <- table

        table <- ball

    }

}


func getResource(key string) {

    // Take ball from table

    ball := <- table


    if wait, ok := ball[key]; ok{

        println("Somebody else working on " + key + ", waiting")

        table <- ball

        <- wait

    } else {

        println("I will build " + key)

        ball[key] = make(chan bool)


        // Throw away ball

        table <- ball


        // Building value

        time.Sleep(time.Millisecond * 10)

        println("I built value for " + key + "!")


        // Clean up ball

        ball = <- table

        close(ball[key])

        delete(ball, key)

        table <- ball

    }


    println("Now value for " + key + " has been built")

}


func main(){

    go keeper()


    ball := make(map[string]chan bool)

    table <- ball


    key := "key"

    go getResource(key)

    go getResource(key)

    go getResource(key)


    time.Sleep(time.Second)

}


查看完整回答
反對(duì) 回復(fù) 2023-08-14
  • 3 回答
  • 0 關(guān)注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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