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

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

想要數(shù)據(jù)競爭還是糟糕的設(shè)計?

想要數(shù)據(jù)競爭還是糟糕的設(shè)計?

Go
慕姐8265434 2023-08-14 17:02:35
我正在實現(xiàn)一個集成第三方 API 的應用程序,該 API 每秒的點擊次數(shù)有限制。我編寫了我的適配器,直到我使用競爭條件檢測器運行測試之前,我是一個快樂的人。設(shè)計很簡單,有一個:計算其發(fā)出的請求的結(jié)構(gòu)每秒將此計數(shù)器重置為 0 的刻度該結(jié)構(gòu)上的私有函數(shù)將被阻塞,直到滿足條件以允許對 API 進行額外的調(diào)用。運行此測試用例效果非常好,直到您給它-race標記為止。我相信數(shù)據(jù)爭用是由滴答線程試圖重置命中計數(shù)器和增加它的調(diào)用請求引起的......我的設(shè)計是否糟糕,或者我應該忍受數(shù)據(jù)爭用警報嗎?import (    "sync"    "testing"    "time")var subject httpClientWrapperfunc init() {    subject = httpClientWrapper{        hits:       0,        hitsSecond: 1,    }    // reset hits every second to 0    go func() {        tick := time.Tick(1 * time.Second)        for range tick {            subject.hits = 0        }    }()}type httpClientWrapper struct {    hits, hitsSecond int}var m sync.Mutexfunc (c *httpClientWrapper) allowCall() {    m.Lock()    callAllowanceReached := c.hits >= c.hitsSecond    for callAllowanceReached {        // cool down for one second        time.Sleep(1 * time.Second)        callAllowanceReached = c.hits >= c.hitsSecond    }    c.hits = c.hits + 1    m.Unlock()}func TestItSleeps(t *testing.T) {    timeStart := time.Now()    var wg = sync.WaitGroup{}    for i := 0; i < 3; i++ {        wg.Add(1)        go func() {            subject.allowCall()            wg.Done()        }()    }    wg.Wait()    elapsedTime := time.Since(timeStart)    if elapsedTime < (1 * time.Second) {        t.Errorf("this test should not had been able to run in less than a second due to locks and cool down")    }}
查看完整描述

1 回答

?
PIPIONE

TA貢獻1829條經(jīng)驗 獲得超9個贊

任何對互斥體的訪問都.hits應該在互斥體后面,所以


// reset hits every second to 0

go func() {

    tick := time.Tick(1 * time.Second)

    for range tick {

        m.Lock()

        subject.hits = 0

        m.Unlock()

    }

}()

此外,互斥體鎖定時不應發(fā)生任何睡眠,因此


m.Lock()

...

    {

        m.Unlock()

        // cool down for one second

        time.Sleep(1 * time.Second)

        m.Lock()

        ...

    }

...

m.Unlock()


查看完整回答
反對 回復 2023-08-14
  • 1 回答
  • 0 關(guān)注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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