ホームページ >バックエンド開発 >Golang >Go でゴルーチンが降伏するのはいつですか?

Go でゴルーチンが降伏するのはいつですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-13 11:27:42225ブラウズ

When Do Goroutines Yield in Go?

ゴルーチンはどの時点で実行を譲ることができますか?

Go プログラムでは、実行の軽量スレッドであるゴルーチンは、次の時点で他のゴルーチンに実行を譲ることができます。さまざまな点で同時実行とリソースの効率的な利用が可能になります。ただし、すべてのゴルーチンの実行が降伏の対象となるわけではありません。

従来、ゴルーチンは主にシステム コール (syscals) のブロックに直面した場合に降伏することが知られていました。ただし、前の議論で述べたように、関数呼び出しは、スタックの成長チェック中にゴルーチンのスイッチをトリガーすることもあります。

質問で説明されている、関数呼び出しやシステムスケールがなくてもゴルーチンが降伏するように見える動作は、 Go バージョン 1.14 での非同期プリエンプションの導入。この拡張機能により、ゴルーチンは、関数呼び出しのない無限ループ内であっても、実行中のほぼすべてのポイントでプリエンプトされる機能が付与されます。

非同期プリエンプションによりスケジューラーの応答性が大幅に向上しますが、プリエンプション ポイントは次のような可能性があることに注意することが重要です。 Go のリリースごとに異なります。したがって、同期目的で特定のプリエンプション ポイントに依存することは一般的に推奨されません。

質問で提供されているコード例では、出力配列と oi インデックスに関する同期が欠如しているため、降伏動作の分析が複雑になります。出力配列で文字列を使用すると、ガベージ コレクションが発生する可能性があり、これによりスケジューリング ポイントが導入される可能性があります。

本質的に、Go のゴルーチンは、システム コール、関数呼び出し、発生する可能性のある非同期プリエンプション ポイントなど、さまざまな時点で実行を生成します。ほぼどこでも。非同期プリエンプションにより、ゴルーチンのスケジューリング動作が大幅に改善されましたが、同期のために特定のプリエンプション ポイントに依存しないようにすることが重要です。

以上がGo でゴルーチンが降伏するのはいつですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。