0
0
テーマ、知りたいこと
非同期イベントドリブン型のプログラミングが世を制覇すると思いますか?
背景、状況
実は以前に同じタイトルで質問させて頂いたのですが、そのときには teratail に「意見交換」タイプの質問がなかったことと、javascript の async/await のサポートで状況が大きく変わったことからもう一度意見を伺いたいです。
昔話
Windows 3.1 や Mac OS System 4 など昔のパソコンのOSはノンプリエンプティブ・マルチタスク(以降、協調的マルチタスクと呼びます)でした。
これらのOSではアプリケーションが自発的にCPUを開放しないとタスクが切り替わらず、一つでもCPU の開放のしかたが悪いプログラムがあると、OSごと凍りついてしまうものでした。そのことが不評で、今や全面的にプリエンプティブ・マルチタスクのOSに置き換えられました。
帰ってきた協調的マルチタスク
今、マルチスレッドのアーキテクチャが抱えるC10K問題に対応するために node.js、 nginx+lua などイベント駆動型やコルーチン型(=協調的マルチタスクというよりも非同期イベントドリブンによる並列処理)で処理する処理系が出始めました。そして、従来の一つのリクエストを一つのスレッドが処理するプリエンプティブなマルチスレッド処理系に比べて高い性能が出るということが定説になっています。
また戦いが
その状況の中で、最近のWebでの議論を見ていると、Linux のマルチスレッドが非常に軽量・高速で協調的マルチタスクじゃなくてもマルチスレッドで十分性能が出るというベンチマーク結果が出てきているようです(※)。そうなると、協調的マルチタスクの処理系はまたなくなってしまうのでしょうか。
前述の昔話において、パソコンのOSがプリエンプティブマルチタスクに置き換えられるときも、OSの実装者は「プリエンプティブマルチタスクなんて必要ない。プログラマが時間のかかる処理を実装するときに処理の途中経過を報告したり、中断したりする機能をちゃんと入れてれば、協調的マルチタスクのほうが効率が高いに決まっている」と執拗に粘ったのですが、世の中の流行には逆らえず(というよりも質の悪いプログラムの多さに負けて)、負けてしまいました。
今回もプリエンプティブマルチタスク(マルチスレッド派)対協調的マルチタスク(イベントドリブン型やコルーチン派)の戦いが始まっているように思います。これを第二次プリエンプティブ戦争と呼びましょう。
※ 参考
- TCP/IP - Solving the C10K with the thread per client approach
- 「サーバ書くなら epoll 使うべき」は、今でも正しいのか
いずれも、非同期イベントドリブンに比べれば性能は出ないと思いますが、「非同期イベントドリブンがないと1万コネクションはできないのかというとそうではない」という主張だと思います。桁が上がって10万コネクションになれば、やはり非同期イベントドリブンが必要なのかもしれません。
ご意見募集
さて、今後10年で JavaScript の非同期イベントドリブンの考え方はさらに流行るでしょうか?それとも一時の流行で廃れるでしょうか?ご意見をお聞かせください。
前回の質問時は Promise をつなげてコーディングすることの難しさがプログラマに敬遠されるだろうという意見がよせられましたが、 async/await の導入でコーディングの書き方の難しさはなくなりました。いかがでしょうか?
回答1件
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。