Node.jsは、スレッドの代わりにイベントループを使用して、イベントベースのモデルをコアに配置することにより、「接続ごとの1つのスレッドの問題」を解決します。負荷の高いI/O操作はすべて、開始された操作が完了すると実行されるコールバックを使用して、常に非同期で実行されます。
操作が発生した場合の監視は、epoll()などの多重化メカニズムによって処理されます。
私の質問は今です:
ブロッキングシステムコールの選択/ epoll/kqueueの使用中にNodeJSがブロックしないのはなぜですか?
または、NodeJSシングルスレッドではないため、2番目のスレッドは
select/epoll/kqueueですべてのI/O操作を監視する必要がありますか?
NodeJSはevented( website の2行目)であり、シングルスレッドではありません。これは、ユーザーが明示的に管理する必要なく、select/epoll/kqueue処理を行うために必要なスレッドを内部的に処理しますが、スレッド内での使用がないという意味ではありません。
番号。
I/O操作が開始されると、それらはlibuvに委任され、独自の(マルチスレッド、非同期)環境を使用して要求を管理します。 libuvはI/O操作の完了を通知し、このイベントを待機しているコールバックをメインV8スレッドに再導入して実行できるようにします。
V8->デリゲートI/O(libuv)->スレッドプール->マルチスレッド非同期
JavaScriptはシングルスレッドなので、イベントモデルです。しかし、Nodeスタックはシングルスレッドではありません。
ノードは、並行性のためにV8エンジンを利用します。
Nodejsは全体としてシングルスレッドではありませんが、Node-Eventループ(nodeJSが頻繁に使用)はシングルスレッドです
ノードフレームワーク/標準ライブラリの一部はシングルスレッドではありません