なぜ Go ランタイムは同時ステートメントを並列実行しないのですか?
質問:
複数の CPU コアにアクセスできるにもかかわらず、それを利用していない Go プログラムを実行しています。同時タスクを実行するためにゴルーチンを使用していますが、それらは順番に実行されます。この動作の原因は何ですか?
回答:
この問題には 2 つの説明が考えられます:
-
GOMAXPROCS 環境変数: GOMAXPROCS 変数は、Go ランタイムが使用できる CPU の数を制御します。デフォルトでは、この変数は 1 に設定されており、ランタイムが単一の CPU のみを使用することを意味します。並列処理を有効にするには、GOMAXPROCS を 1 より大きい値に設定する必要があります。これを行うには、環境変数を設定するか、コード内で runtime.GOMAXPROCS 関数を使用します。
-
チャネル通信: ゴルーチンがチャネルを介して相互に通信するのにかなりの時間を費やしている場合、複数の CPU コアを使用すると、実際にパフォーマンスが低下する可能性があります。これは、チャネル通信にはコンテキストの切り替えが含まれ、オーバーヘッドが追加される可能性があるためです。このような場合、すべてのゴルーチンに単一の CPU コアを使用する方が効率的です。
以上がGo ゴルーチンが並列実行されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。