Go のバッファリング ロック パターン
Go では、バッファリングされたチャネルにより、バッファがいっぱいになるまでブロックせずに通信を継続できます。しかし、特定の数のクライアントへのリソース アクセスを制限するバッファリング ロックの同様のパターンはありますか?
リソースへの同時アクセスを管理するためのプリミティブは、セマフォです。セマフォはバッファ付きチャネルを使用して簡単に実装できます。
例を示します:
var semaphore = make(chan struct{}, 4) // allow four concurrent users func f() { // Grab the lock. Blocks if 4 other concurrent invocations of f are running. semaphore <- struct{}{} // Release the lock when the function is done. defer func() { <-semaphore }() // Perform the intended operations... }
この例では、サイズ 4 のバッファを持つセマフォが semaphore := make( chan 構造体{}、4)。 f() 関数は、空の構造体をチャネルに送信してロックを取得しようとします。チャネル バッファーがいっぱいの場合 (つまり、f() の 4 つの同時インスタンスがすでに実行されている場合)、セマフォ <- struct{}{} の呼び出しは、ロックが利用可能になるまでブロックされます。
関数が終了したときそのタスクでは、チャネルから空の構造体を取得することでロックを解放します (-
このパターンは、共有リソースへのアクセスを特定の数の同時クライアントに制限する便利な方法を提供し、潜在的なリソース競合の問題を防ぎます。
以上がGo にはバッファリングされたチャネルと同様のバッファリングされたロック パターンはありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。