Go での期限付きロックの取得
Go では、sync.Mutex 型は Lock() メソッドと Unlock() メソッドのみを提供します。期限内にロックの取得を試行する必要があるシナリオ、または即時に中止される可能性があるシナリオには、組み込みのソリューションはありません。
提案されたソリューション: ミューテックスとしてのチャネル
別のアプローチは、バッファ サイズが 1 のチャネルを使用してミューテックスをシミュレートすることです。単一の空の構造体の値 (struct{}{}) を送受信することで、ロックおよびロック解除の操作を実行できます。
Lock:
<code class="go">l := make(chan struct{}, 1) l <- struct{}{}</code>
ロック解除:
<code class="go"><-l</code>
ロックを試行:
<code class="go">select { case l <- struct{}{}: // lock acquired <-l default: // lock not acquired }</code>
タイムアウト付きでロックを試行:
<code class="go">select { case l <- struct{}{}: // lock acquired <-l case <-time.After(time.Minute): // lock not acquired }</code>
提供されている例では、s.someObj はキーから値へのマップであると想定されています。
例 1: 遅延に敏感なコードの LockBefore()
<code class="go">// DoTheThing locks before performing expensive computations. func (s *RPCService) DoTheThing(ctx context.Context, ...) ... { l := make(chan struct{}, 1) select { case l <- struct{}{}: defer <-l ... expensive computation based on internal state ... default: return s.cheapCachedResponse[req.Parameter] } }</code>
例 2: 統計を更新するための TryLock()
<code class="go">// updateObjStats attempts to lock and update stats. func (s *StatsObject) updateObjStats(key, value interface{}) { l := make(chan struct{}, 1) select { case l <- struct{}{}: defer <-l ... update stats ... ... fill in s.cheapCachedResponse ... default: // skip locked object } } // UpdateStats attempts to lock and update stats for all objects. func (s *StatsObject) UpdateStats() { s.someObj.Range(s.updateObjStats) }</code>
以上がGoで期限付きのロックを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。