1. ホーム
  2. node.js

[解決済み】Node.jsはなぜシングルスレッドなのですか?[クローズド]

2022-03-31 13:56:23

質問

PHP(またはJava/ASP.NET/Ruby)ベースのウェブサーバーでは、すべてのクライアントリクエストは新しいスレッドでインスタンス化されます。しかし、Node.jsでは、すべてのクライアントは同じスレッド上で実行されます(同じ変数を共有することさえできます!)I/O操作はイベントベースなので、メインスレッドのループをブロックしないことは理解しています。

私が理解できないのは、Nodeの作者がなぜシングルスレッドにしたのか、ということです。それは、物事を難しくしています。例えば、CPUに負荷のかかる関数はメインスレッドをブロックしてしまうので実行できません(新しいクライアントからのリクエストもブロックされます)ので、プロセスを生成する必要があります(つまり、別のJavaScriptファイルを作成し、その上で別のnodeプロセスを実行する必要があります)。しかし、PHPではCPU集約的なタスクが他のクライアントをブロックすることはありません。マルチスレッドのウェブサーバーと比較して、その利点は何ですか?

注:クラスタリングを使って回避したこともありますが、きれいなものではありません。

どのように解決するのか?

Node.jsは、明らかに非同期処理の実験として作成されました。その理論は、シングルスレッドで非同期処理を行うことで、一般的なスレッドベースの実装よりも、一般的なWeb負荷に対してより高いパフォーマンスとスケーラビリティを提供できる、というものでした。

そして、何を知っていますか?私の考えでは、その理論は実証されました。CPUに負荷をかけないnode.jsアプリは、ApacheやIISなどのスレッドベースサーバーよりも何千もの同時接続を実行することができます。

シングルスレッドで非同期という性質が、物事を複雑にしているのです。しかし、正直なところ、スレッディングよりも複雑だと思いますか?1つのレースコンディションが、あなたの月全体を台無しにしてしまうのです。あるいは、どこかの設定によってスレッドプールが空になってしまい、応答時間が這うように遅くなるのを見ることになります デッドロックや優先順位の逆転はもちろん、マルチスレッドに付随する他のすべての混乱も同様です。

結局、普遍的に良いとか悪いとかではなく、それぞれ違っていて、良いときもあれば悪いときもあるということだと思います。仕事には適切なツールを使いましょう。