👨💼「並列処理と並行処理の違いはなんですか?JSの非同期処理はどちらに該当しますか?」
まえがき
こんなこと急に聞かれたら困りますよね(?)。CS専攻じゃないとそこまで気にしたことがない人も多いと思います。名前が似ていてややこしいですが、根本的な違いがあるのでまとめてみました。
並列処理と並行処理の違い
並列処理
複数のスレッドでプロセス(タスク)を同時に実行する処理。
並行処理
単一のスレッドで、複数のプロセス(タスク)を高速で切り替えながら実行する処理。
(人間からしたら複数タスクが同時に実行されているように見えるが、実際は高速に切り替えながら一つ一つの処理を交互に行っているので、同時に複数のプロセス(タスク)は実行されていない)
自己流の覚え方
並列処理は、列が実際に並んでいるから複数スレッドで同時に実行する方だな、という風に覚えてます(並行はその逆)。
小まとめ
並列処理 | 並行処理 |
---|---|
複数スレッドを使って同時に処理 | 1スレッド内で高速切り替えしながら処理 |
CPUのシングルコア・マルチコアもこれで説明できます。シングルコアのCPUで複数のアプリを開いている際は、同時にアプリが実行処理されているように見えて、並行処理で高速に処理を切り替えて一つずつ実行しています。ただその切り替えはとても早いので、私たちの目には同時に実行されているように見えます。
ちなみに、CPUのクロック数(単位Hz)の大きさも、この処理の切り替え速度(回数)に大きく影響を与えます。
JavaScriptの非同期処理は並列処理?並行処理?
結論:ほとんどの場合は並行処理
そもそもJavaScriptはシングルスレッドで処理が行われているという前提があります。その上で、非同期処理というものはどのような処理を行っているのか考えてみましょう。
JavaScriptで非同期に処理する、つまり、同期的でない(他のタスクに依存せず、順番待ちにならない?裏側で実行される?)ということなので、まるで複数スレッドで処理が行われる並列処理であるように考えた人もいるかもしれません。
ですが、JavaScriptがシングルスレッドで処理されている以上、非同期処理は並行処理で実行されます。コードの実装の順番と、実際に実行・処理する順番に違いはあれど、同時に処理が行われるたり、裏で処理が行われるようなことはないです。
じゃあ非同期処理ってどういうメリットがあるんだっけってなった人へ
結局他のタスクと同時に実行したり、裏側で実行したりできない(基本的には)となると、なんのために非同期処理を実装するのかわからなくなってきた人もいるかもしれませんが、非同期処理のメリットは、順番を抜かすことができることです。
API周りの処理などを非同期にしないと、他の処理(本当であれば一瞬で完了する)がAPIの処理終わり待ちになってしまい、画面が表示されなかったり、スクロールできなくなったりしてしまいます。
これは同期的にAPI周りの処理を実装したことで、他の処理が始まらないからです。
非同期にAPI周りの処理を実装すると、他の処理はこの処理の順番を抜かすことができます。シングルスレッド内で高速でタスクを切り替えながら実行する中で、時間のかからない軽い処理はすぐに完了し、比較的時間のかかるAPI周りの処理の完了は後回しになります。これにより、ユーザはAPI周りの処理の完了を待っている間でも、画面を見たり、スクロールを行うことができます。
まとめ
今回は並列処理・並行処理についてまとめてみました。JavaScriptの非同期処理についても、昔自分も苦戦した覚えがあるので、理解を深めるきっかけになれば幸いです。読んでいただきありがとうございました🤝
参考文献
Discussion