他のブロックをブロックする Go ルーチン: 詳しい説明
Go では、次のコードは、無限ループを持つ goroutine のように見える異常な動作を示します。別のゴルーチンのメッセージが意図したメッセージに到達するのを防ぎます。 channel:
func main() { timeout := make(chan int) go func() { time.Sleep(time.Second) timeout <- 1 }() res := make(chan int) go func() { for { } res <- 1 }() select { case <-timeout: fmt.Println("timeout") case <-res: fmt.Println("res") } }
プログラムは 1 秒後に終了するのではなく、無限ループに入ります。なぜこのようなことが起こるのでしょうか?
Go の協調スケジューリングを理解する
その答えは、Go がゴルーチンに対して協調スケジューリングを使用していることにあります。ゴルーチンは、次のような特定の条件下でスケジューラに制御を渡します。
GOMAXPROCS の増加:
この環境変数を使用すると、複数のスレッドがゴルーチンを同時に実行できるようになり、1 つのゴルーチンが他のゴルーチンをブロックする可能性が減ります。
以上がInfinite Go ルーチンが他の Go ルーチンのチャネルへの送信をブロックするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。