並列処理/並行処理とか同期処理/非同期処理について

プロセス

プログラムの実行単位のこと。リソースを共有しない固有のメモリ空間を持つ。

スレッド

プロセスの実行単位のこと。リソースを共有する共通のメモリ空間を持つ。

シングルスレッド

処理の流れが一つのみ

マルチスレッド

二つ以上の処理が同時に実行される

並列処理

マルチスレッドで複数の処理を同時に実行する。
主に処理速度の向上が目的。

並行処理

実行状態を複数維持しながら、それぞれを細切れにして順不同で処理する。
人間にはあたかも同時に処理されているように見える。

同期処理と非同期処理


非同期処理の概念について解説 | このリポジトリについて

すごく分かりやすかった。

同期処理をサブウェイ、非同期処理をドトールコーヒーのオペレーションに例えて解説している。

同期処理(サブウェイ方式)

サブウェイでの注文は、

店員さんに注文→パンの選択→トッピング→野菜の増減→ソース選択→会計

という流れで行われる。これが同期処理と同じで

  • 処理が順番に実行されるので処理内容が把握しやすい

  • 特定の処理で時間がかかった場合、それ以降の処理は待たされる

という特徴がある。

非同期処理(ドトール方式)

サブウェイでは注文→会計が一連の流れになっていたが、ドトールでは

注文→会計を先に済ませる→商品が出来上がったらお客さんが呼ばれて受け取る

という流れになっている。


同期処理では特定の処理に時間がかかるとそれ以降の処理が待たされることがあった。
しかし非同期処理の場合は上記のように処理が終わった順に呼ばれるので待たされることはない。

ただ、例えばテイクアウトの場合、フード担当とドリンク担当が互いの処理の完了を確認してからお客さんを呼ばなければならない。

このような処理が増えると、一方通行で処理をする同期処理と比べて処理内容が把握しづらくなる可能性が高くなる。
実際に非同期処理では「状態を確認→何らかの処理を実行」という流れが生じやすい。



重要なこと


  • JavaScripはシングルスレッドで動いているので並列処理はできない。非同期処理はできる。

    Javascriptの非同期処理

    DBなどの処理やHTTP通信など、JavaScriptのスレッドがやらなくてもよい仕事を外部に任せている間に自分の仕事を進められる。

console.log(1);
setTimeout(function(){console.log(2)}, 1000);
console.log(3);

まず上から順に同期処理でキューに登録、実行されていく。
ここでsetTimeoutに関しては、タイマーにlog(2)を登録し、1000ミリ秒カウントする仕事を任せる。

なので、キューに登録されていたlog(1), log(3)が実行されたあと、任された仕事を進めていたタイマーの方で1000ミリ秒のカウントが終わるとlog(2)をキューに登録する。
このときlog(2)は最初の3つの関数とは独立してキューに登録される。(これが非同期処理)
そしてlog(2)が実行される。表示は以下のようになる。

1
3
2


関数単位で順に実行されていくが、
非同期処理では実行準備ができたコールバック関数(上記だとlog(2))が待ち行列をつくり、現在実行中の関数の処理が終了してから順に実行されていく




参考リンク

マルチスレッド/プロセスまとめ(Ruby編) - Qiita

JavaScriptの同期、非同期、コールバック、プロミス辺りを整理してみる - Qiita