- 同時実行性: 処理のためにさまざまな時点でタスクをプロセッサに渡します。同時に、タスクは同時に実行されません。
- 並列処理: 各タスクを各プロセッサに割り当てて、独立して完了します。同じ時点で、タスクは同時に実行されている必要があります。
同時実行は並列処理ではありません。並列処理とは、異なるコードを異なる物理プロセッサ上で同時に実行することです。並列処理の鍵は、多くのことを同時に実行することであり、同時実行とは、多くのことを同時に管理することを指します。これらのことは、半分だけ完了した後で他のことを行うために中断される場合があります。
多くの場合、同時実行の効果は並列処理よりも優れています。これは、オペレーティング システムとハードウェアの合計リソースは一般に小さいためですが、同時実行によりシステムが多くのことを同時に実行できるようになります。この「少ないリソースでより多くのことを行う」という哲学は、Go 言語の設計を導く哲学でもあります。
goroutine を並列化したい場合は、複数の論理プロセッサを使用する必要があります。複数の論理プロセッサがある場合、スケジューラはゴルーチンを各論理プロセッサに均等に分配します。これにより、Goroutine が別のスレッドで実行されます。ただし、実際に並列効果を実現するには、ユーザーは複数の物理プロセッサを備えたマシンでプログラムを実行する必要があります。そうしないと、Go 言語の実行中に複数のスレッドが使用された場合でも、ゴルーチンは同じ物理プロセッサ上で同時に実行され、並列処理の効果が得られません。
以下の図は、1 つの論理プロセッサーでゴルーチンを同時に実行する場合と、2 つの論理プロセッサーで 2 つのゴルーチンを同時に実行する場合の違いを示しています。スケジューラには、Go 言語のリリースに合わせて更新および改善される賢いアルゴリズムが含まれているため、論理プロセッサの言語ランタイムのデフォルト設定をやみくもに変更することはお勧めできません。論理プロセッサの数を変更することでパフォーマンスが向上すると本当に考えられる場合は、言語ランタイムのパラメーターを微調整することもできます。
Go言語はGOMAXPROCSの数とタスクの数が同じであれば並列実行可能ですが、一般的には並行して実行されます。