thread
プロセス中の実行単位。プロセッサは独立してスケジューリングを行うことができる。
シングルスレッド
1つのプロセスが1つのスレッドを持つ
multi thread
1つのプロセスが複数のスレッドを持つ
スレッドを複数使うと、単一のプロセス内で複数の仕事をおこなわせることができる(multi thread)
例:複数の仕事をする単一プロセスについて考える
シングルスレッドの場合、複数の仕事は直列化される(1度に1つの仕事しかできない)
ここでI/O待ちやユーザの入出力が発生した場合、他の処理が(もし独立していれば)実行できるはずなのに待ってしまってもったいない
マルチプロセスにすればI/O待ちのときに他の仕事を実行できる
スループットが上がってうれしい!
https://keens.github.io/blog/2021/01/04/future_of_proguramming_languages/
Webプログラミングではそんなにスレッドを気にすることはないです。 なぜならリクエスト単位での並行性というものすごく粒度も丁度いい並行性があるからです。 そういうのはWebフレームワークが解決してくれるので、プログラマはあんまりスレッドとかを気にしなくてよいです。
WebアプリケーションはDBや他のサービスとの通信などのネットワークを介した処理がよくあります。 そこでまともに通信が終わるのを待ってるとほとんどの時間が待ち時間で終わってしまうのでスレッドが完全に遊んでしまいます。 となるとIOでブロックしない仕組みとタスクを中断したり再開したりできる仕組みが必要になります。
タスクを中断したり再開したりする仕組みはぼ言語のサポートが必須といっていいでしょう。 CPS変換したりステートマシンを書いたりする方法がなくはないですが、とても面倒です。
なので言語によるgreen thread、あるいは便利構文のサポートか、(限定)継続が必要になります。
async/awaitがよく採用されますが、高階関数との親和性がよくないので個人的には微妙だなって思ってます