このシナリオでは、Go ルーチンに操作を停止するよう指示する必要があります。主な課題は、ブロッキング動作を導入せずにこのシグナリングを実現することにあります。
提案されたソリューションには、セカンダリ チャネルの採用が含まれます。ただし、従来のチャネルの使用法では、go ルーチンがデータをアクティブに処理しているときにこのチャネルからシグナルを受信しようとすると、ブロックが発生します。
ブロックを回避するには、コードで以下を利用できます。デフォルト句を含む選択ケース。これにより、go ルーチンはセカンダリ チャネルからシグナルを受信するまでデータの処理を続行できます:
<code class="go">go func() { for { fmt.Println("working") time.Sleep(1 * time.Second) select { case <-tooLate: fmt.Println("stopped") return case proCh <- "processed": //this why it won't block the goroutine if the timer expirerd. default: // adding default will make it not block } fmt.Println("done here") } }()</code>
default 句を利用することで、go ルーチンはタイマーが期限切れになった場合でもブロックを回避できます。
もう 1 つのアプローチには、チャネルの代わりに sync.Cond を利用する方法があります。条件変数は、ゴルーチン間で待機してシグナルを送る方法を提供します。
default 句または sync.Cond を備えたセカンダリ チャネルを使用すると、go ルーチンに停止するよう効果的にシグナルを送ることができます。ブロック動作に頼らずに実行します。
以上がブロックせずに Go ルーチンに停止するように通知する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。