Go の軽量スレッドであるゴルーチンは、同時実行にとって非常に重要です。コードのパフォーマンスを最適化するには、いつ制御を譲り渡すかを理解することが不可欠です。
従来のプリエンプション ポイント
以前は、ゴルーチンは次のような特定のポイントでのみ譲歩しました。
非同期プリエンプション (Go 1.14 )
Go のバージョン 1.14 では非同期プリエンプションが導入され、ゴルーチンはほぼどこでも制御を譲れるようになりました。これにより、デッドロックや遅延のリスクが軽減されます。
例のプリエンプション ポイント
質問で提供されているサンプル コードには、関数呼び出しやブロック システムコールは含まれていません。ただし、出力には依然としてメッセージのインターリーブが表示され、ゴルーチンが譲歩していることを示しています。
プリエンプションの考えられる理由
結論
Go プログラムで、ゴルーチンが制御を譲れるようになりましたほぼすべての時点で非同期的に実行されます。これは、特定のプリエンプション ポイントを必要とした以前のバージョンからの改善です。ただし、ガルーチンのスケジューリングに影響を与える可能性のあるガベージ コレクションやその他の要因の潜在的な影響を認識することが重要です。
以上がGo でゴルーチンが譲歩するとき: 同期プリエンプションと非同期プリエンプション?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。