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

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

如何去測試 go 例程?

如何去測試 go 例程?

Go
白板的微信 2021-06-04 15:07:00
此問題的一個(gè)示例是當(dāng)用戶創(chuàng)建資源并刪除資源時(shí)。我們將執(zhí)行操作并增加(減少)計(jì)數(shù)器緩存。在測試中,有時(shí)會出現(xiàn)競爭條件,即 go 例程尚未更新計(jì)數(shù)器緩存。編輯:抱歉混淆,澄清一下:計(jì)數(shù)器緩存不在內(nèi)存中,它實(shí)際上是數(shù)據(jù)庫中的一個(gè)字段。競爭條件不是內(nèi)存中的變量,實(shí)際上是 goroutine 寫入數(shù)據(jù)庫本身可能很慢!我目前在操作后使用 1 秒睡眠來確保在測試計(jì)數(shù)器緩存之前更新了計(jì)數(shù)器緩存。是否有另一種方法來測試 go 例程而無需任意 1 秒睡眠等待 go 例程完成?
查看完整描述

2 回答

?
倚天杖

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

在測試中,有時(shí)會出現(xiàn)競爭條件,即 go 例程尚未更新計(jì)數(shù)器緩存。我目前在操作后使用 1 秒睡眠來確保在測試計(jì)數(shù)器緩存之前更新了計(jì)數(shù)器緩存。

哎呀,我不想這么說,但你做錯(cuò)了。Go 具有一流的功能,使并發(fā)變得容易!如果您正確使用它們,則不可能有競爭條件。

事實(shí)上,有一種工具可以為您檢測種族。我敢打賭它會抱怨你的程序。

一個(gè)簡單的解決方案:

  • 讓主程序創(chuàng)建一個(gè) goroutine 來跟蹤計(jì)數(shù)器。

  • goroutine 只會做一個(gè)選擇并獲取一條消息來增加/減少或讀取計(jì)數(shù)器。(如果是讀取,會傳入一個(gè)通道返回編號)

  • 當(dāng)您創(chuàng)建/刪除資源時(shí),通過它的通道向 goroutine 計(jì)數(shù)器發(fā)送適當(dāng)?shù)南ⅰ?/p>

  • 當(dāng)要讀取計(jì)數(shù)器時(shí),發(fā)送消息進(jìn)行讀取,然后讀取返回通道。

(另一種選擇是使用鎖。它的性能會更高一點(diǎn),但編寫并確保它是正確的要麻煩得多。)


查看完整回答
反對 回復(fù) 2021-06-28
?
慕標(biāo)琳琳

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

一種解決方案是讓您的柜臺提供一個(gè)渠道,該渠道在價(jià)值發(fā)生變化時(shí)立即更新。在 go 中,通過傳達(dá)結(jié)果來同步是常見的做法。例如,您 Couter可能看起來像這樣:


type Counter struct {

   value int

   ValueChange chan int

}


func (c *Counter) Change(n int) {

    c.value += n

    c.ValueChange <- c.value

}

每當(dāng)Change被調(diào)用時(shí),新值都會通過通道傳遞,等待該值的人會解除阻塞并繼續(xù)執(zhí)行,因此與計(jì)數(shù)器同步。使用此代碼,您可以監(jiān)聽如下ValueChange更改:


v := <-c.ValueChange

并發(fā)調(diào)用c.Change不再是問題。


查看完整回答
反對 回復(fù) 2021-06-28
  • 2 回答
  • 0 關(guān)注
  • 247 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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