Go でのバッファリングされたロック
Go では、バッファリングされたチャネルにより、バッファがいっぱいになるまでブロックすることなく通信が可能になります。ここで疑問が生じます: 限られた数のクライアントに対してリソースがロックされる、バッファー ロックの一般的なパターンはありますか?
答え: セマフォ
のプリミティブ限られた数のクライアントのリソースをロックするのがセマフォです。セマフォはバッファリングされたチャネルを使用して簡単に実装できます。
次の例を考えてみましょう:
var semaphore = make(chan struct{}, 4) // allow four concurrent users func f() { // Grab the lock. Blocks as long as 4 other invocations of f are still running. semaphore <- struct{}{} // Release the lock once we're done. defer func() { <-semaphore }() // Do work... }
この例では、4 つの要素 (make(chan struct{}, 4) を持つバッファリングされたチャネル) ) はセマフォとして機能します。 f 関数は、チャネルに値を送信してロックを取得します。チャネルがいっぱいの場合、関数は値を受信するまでブロックされます。ロックが取得されると、defer ステートメントによって、関数が戻ったときにロックが確実に解放されます。
バッファーされたチャネルで実装されたセマフォを使用することで、リソースへのアクセスを制限された数に制限するバッファーされたロック パターンを作成できます。同時ユーザー数。
以上がGo でバッファー ロックを実装するためにバッファー チャネルを使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。