他のゴルーチンをブロックする
Go では、ゴルーチンは軽量の実行スレッドです。通常、ゴルーチンは互いにブロックすることなく同時に実行できます。ただし、特定の状況下では、1 つのゴルーチンが他のゴルーチンの実行をブロックする可能性があります。
次のコードを考えてみましょう:
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") } }
この例では、ゴルーチンは無限ループで開始されます。通常、このゴルーチンは他のゴルーチンの実行を妨げるべきではありません。ただし、最初のゴルーチンが何らかの理由で 2 番目のゴルーチンのタイムアウト チャネルへの送信をブロックしているようです。
説明
この動作は、ゴルーチンの仕組みによるものです。 Goで予定されています。協調スケジューリングが使用されます。これは、別の goroutine を実行するには、goroutine が自発的にスケジューラに実行を渡す必要があることを意味します。提供されたコードでは、無限ループのあるゴルーチンは決して譲歩せず、他のゴルーチンの進行を妨げます。
ゴルーチンは通常、次の条件下で譲歩します:
この場合、これらの条件がどれも満たされないため、無限ループを伴うゴルーチンは実行を継続します。
解決策
この問題を解決するには、いくつかの解決策が考えられます。
特定のアプリケーションに最適なソリューションは、ゴルーチンの性質と望ましい動作によって異なります。
以上が無限ループを持つゴルーチンは Go で他のゴルーチンをブロックするにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。