Golang で時間制約のあるロックを取得する
Golang でロックを操作する場合、状況によってはロックを取得する必要がある場合があります。直ちに、または何らかの形の期限を遵守してください。標準ライブラリの sync.Mutex は Lock() 関数と Unlock() 関数のみを提供しますが、期限付きロックをエミュレートできる手法があります。
期限付きロックの実装
期限付きのロックを作成するには、バッファ サイズが 1 のチャネルを使用できます:
l := make(chan struct{}, 1)
ロックするには、構造体の値をチャネルに送信します:
l <- struct{}{}
ロックを解除するには、チャネルから受信します:
<-l
Try Lock の実行
Try ロックを試行するには、select ステートメントを使用します:
select { case l <- struct{}{}: // lock acquired <-l default: // lock not acquired }
このコードは、ロックが利用可能な場合は直ちにロックを取得します。ロックがすでに保持されている場合、select ステートメントはロックが解放されるまでブロックされます。
Try Lock with Timeout
try ロックのタイムアウトを指定するには、次を追加します。 select ステートメントへの time.After() チャネル:
select { case l <- struct{}{}: // lock acquired <-l case <-time.After(time.Minute): // lock not acquired }
このコードは、最大 1 分間ロックの取得を試みます。タイムアウトが経過すると、select ステートメントは終了し、ロックは取得されません。
結論
バッファ サイズ 1 のチャネルをミューテックスとして使用する期限付きの試行ロックを実装できます。この手法は、ロックを迅速に取得する必要があるシナリオ、または特定の時間枠内にロックを取得する必要があるシナリオで役立ちます。
以上がGolang で期限付きのロックを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。