Go のセマフォはチャネルで実装されます。
例はこれです: https://sites.google.com/site/gopatterns/concurrency/semaphores
環境:
数百のサーバーがあり、アクセスを制限したい共有リソースがあります。したがって、特定のリソースに対して、セマフォを使用して、これらのサーバーによる同時アクセスを 5 つだけに制限したいと考えています。そのために、ロックサーバーを使用する予定です。マシンがリソースにアクセスすると、最初にキーによってリソースにアクセスしていることをロック サーバーに登録します。そして、それが完了すると、ロックサーバーに別のリクエストを送信して、完了したことを伝え、セマフォを解放します。これにより、これらのリソースへのアクセスを同時アクセスの最大数に制限できます。
問題:何か問題が発生した場合に、これを適切に処理したい。
質問:
セマフォにタイムアウトを実装するにはどうすればよいですか?
例:
セマフォのサイズが 5 だとしましょう。セマフォでロックを取得しようとするプロセスが同時に 10 個あるため、この場合は 5 つだけがロックを取得します。
場合によっては、プロセスが応答せずに終了することがあります (本当の理由は説明が少し複雑ですが、基本的にプロセスがロックを解除しない場合があります)。そのため、セマフォ内のスペースが永久にロックされるため、問題が発生します。
したがって、これにはタイムアウトが必要です。ここにいくつかの問題があります:
プロセスは 2 秒から 60 分の間で実行されます。
タイムアウトになってからプロセスがロックを解除しようとすると、セマフォを 1 回ではなく 2 回ロック解除したことになるため、いくつかの競合状態があります。逆に、最初にロックを解除してからタイムアウトします。
上記の提案されたパターンを使用して、これをタイムアウト付きのスレッドセーフなセマフォに変えるにはどうすればよいですか?