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

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

試圖在 golang 中獲取具有截止日期的鎖?

試圖在 golang 中獲取具有截止日期的鎖?

Go
PIPIONE 2023-06-05 17:02:19
如何在 go 中只嘗試獲取類似互斥鎖的鎖,要么立即中止(就像TryLock在其他實(shí)現(xiàn)中所做的那樣),要么通過觀察某種形式的截止日期(基本上是LockBefore)?我現(xiàn)在可以想到兩種情況,這會(huì)非常有幫助,而我正在尋找某種解決方案。第一個(gè)是:接收延遲敏感請(qǐng)求的 CPU 密集型服務(wù)(例如 Web 服務(wù))。在這種情況下,您可能希望執(zhí)行類似于下面的RPCService示例的操作??梢詫⑵鋵?shí)現(xiàn)為工作隊(duì)列(帶有通道和其他東西),但在那種情況下,衡量和利用所有可用 CPU 變得更加困難。也可以只接受當(dāng)你獲得鎖時(shí)你的代碼可能已經(jīng)超過了截止日期,但這并不理想,因?yàn)樗速M(fèi)了一些資源并且意味著我們不能做像“降級(jí)的臨時(shí)任務(wù)”這樣的事情回復(fù)”。    /* Example 1: LockBefore() for latency sensitive code. */    func (s *RPCService) DoTheThing(ctx context.Context, ...) ... {      if s.someObj[req.Parameter].mtx.LockBefore(ctx.Deadline()) {        defer s.someObj[req.Parameter].mtx.Unlock()        ... expensive computation based on internal state ...      } else {        return s.cheapCachedResponse[req.Parameter]      }    }另一種情況是當(dāng)你有一堆應(yīng)該被觸摸的對(duì)象,但它們可能被鎖定,并且觸摸它們應(yīng)該在一定時(shí)間內(nèi)完成(例如更新一些統(tǒng)計(jì)數(shù)據(jù))。在這種情況下,您還可以使用LockBefore()或某種形式的TryLock(),請(qǐng)參閱下面的統(tǒng)計(jì)信息示例。    /* Example 2: TryLock() for updating stats. */    func (s *StatsObject) updateObjStats(key, value interface{}) {      if s.someObj[key].TryLock() {        defer s.someObj[key].Unlock()        ... update stats ...        ... fill in s.cheapCachedResponse ...      }    }    func (s *StatsObject) UpdateStats() {      s.someObj.Range(s.updateObjStats)    }為了便于使用,我們假設(shè)在上述情況下我們談?wù)摰氖窍嗤膕.someObj。任何對(duì)象都可能被DoTheThing()操作阻塞很長(zhǎng)時(shí)間,這意味著我們希望在updateObjStats中跳過它。此外,我們希望確保在DoTheThing()中返回廉價(jià)響應(yīng),以防我們無法及時(shí)獲得鎖定。不幸的是, sync.Mutex 僅具有功能Lock()和Unlock()。沒有辦法潛在地獲取鎖。有沒有一些簡(jiǎn)單的方法可以做到這一點(diǎn)?我是不是從一個(gè)完全錯(cuò)誤的角度來處理這類問題,是否有一種不同的、更“走”的方式來解決它們?或者如果我想解決這些問題,我是否必須實(shí)現(xiàn)自己的 Mutex 庫(kù)?我知道issue 6123似乎暗示沒有這樣的事情,而且我處理這些問題的方式完全不可行。
查看完整描述

3 回答

?
明月笑刀無情

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

使用緩沖區(qū)大小為 1 的通道作為互斥鎖。


l := make(chan struct{}, 1)

鎖:


l <- struct{}{}

開鎖:


<-l

嘗試鎖定:


select {

case l <- struct{}{}:

    // lock acquired

    <-l

default:

    // lock not acquired

}

嘗試超時(shí):


select {

case l <- struct{}{}:

    // lock acquired

    <-l

case <-time.After(time.Minute):

    // lock not acquired

}


查看完整回答
反對(duì) 回復(fù) 2023-06-05
?
BIG陽

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

我想你在這里問了幾件不同的事情:

  1. 標(biāo)準(zhǔn)庫(kù)中是否存在此功能?不,它沒有。您可能可以在其他地方找到實(shí)現(xiàn) - 這可以使用標(biāo)準(zhǔn)庫(kù)(例如原子)來實(shí)現(xiàn)。

  2. 為什么標(biāo)準(zhǔn)庫(kù)中不存在此功能:您在問題中提到的問題是一個(gè)討論。在 go-nuts 郵件列表上也有幾個(gè)討論,有幾個(gè) Go 代碼開發(fā)人員貢獻(xiàn):鏈接 1,鏈接 2。通過谷歌搜索很容易找到其他討論。

  3. 我怎樣才能設(shè)計(jì)我的程序,這樣我就不需要這個(gè)了?

(3) 的答案更加微妙,取決于您的具體問題。你的問題已經(jīng)說了

可以將它實(shí)現(xiàn)為一個(gè)工作隊(duì)列(帶有通道和東西),但在那種情況下,衡量和利用所有可用的 CPU 變得更加困難

沒有詳細(xì)說明為什么與檢查互斥鎖狀態(tài)相比,使用所有 CPU 會(huì)更加困難。

在 Go 中,只要鎖定方案變得重要,您通常就需要通道。它不應(yīng)該更慢,而且應(yīng)該更易于維護(hù)。


查看完整回答
反對(duì) 回復(fù) 2023-06-05
?
慕雪6442864

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

go-lock除了 Lock 和 Unlock 之外,還實(shí)現(xiàn)TryLock,TryLockWithTimeout和功能。TryLockWithContext它提供了控制資源的靈活性。

例子:

package main


import (

? ? "fmt"

? ? "time"

? ? "context"


? ? lock "github.com/viney-shih/go-lock"

)


func main() {

? ? casMut := lock.NewCASMutex()


? ? casMut.Lock()

? ? defer casMut.Unlock()


? ? // TryLock without blocking

? ? fmt.Println("Return", casMut.TryLock()) // Return false


? ? // TryLockWithTimeout without blocking

? ? fmt.Println("Return", casMut.TryLockWithTimeout(50*time.Millisecond)) // Return false


? ? // TryLockWithContext without blocking

? ? ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)

? ? defer cancel()


? ? fmt.Println("Return", casMut.TryLockWithContext(ctx)) // Return false



? ? // Output:

? ? // Return false

? ? // Return false

? ? // Return false

}


查看完整回答
反對(duì) 回復(fù) 2023-06-05
?
Helenr

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

PMutex 實(shí)現(xiàn) RTryLock(ctx context.Context) 和 TryLock(ctx context.Context)

// ctx - some context

ctx := context.Background()

mx := mfs.PMutex{}

isLocked := mx.TryLock(ctx)

if isLocked {

? ? // DO Something

? ? mx.Unlock()

} else {

? ? // DO Something else

}


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

添加回答

舉報(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)