2

node.js で作成された HTTP サーバーは、着信接続 (要求) ごとに新しいスレッドを作成しないことを読みました。代わりに、リクエストを受信したイベントに対応するコールバックとして登録されている関数を実行します。

各接続は、ヒープ内の小さなスペースで表されると言われています。私はこれを理解することはできません。接続はソケットで表されていませんか? node.js サーバーへのすべての接続に対してソケットを開く必要はありません。これは、各接続を javascript ヒープ内のスペース割り当てだけでは表すことができないことを意味しますか?

4

1 に答える 1

3

nodejs.org Web サイトで説明されているように、接続ごとにスレッドを生成する代わりに (スレッドごとに 2 MB のオーバーヘッド!)、サーバーは select()、epoll、kqueue、または /dev/poll を使用して、ソケットの読み取り/書き込みの準備が整うまで待機します。 . ノードが接続ごとのスレッドのスポーンを回避できるようにするのはこのメソッドであり、オーバーヘッドは接続のソケット記述子のヒープ割り当てに関連するものです。この実装の詳細は開発者にはほとんど隠されています。ランタイムによって公開される net.socket API は、ユーザーが何も考えずにその機能を利用するために必要なすべてを提供します。

Node は、events.EventEmitter を通じて独自のイベント API も公開します。多くのノード オブジェクトは、非同期 (非ブロッキング) イベント通知を提供するイベントを実装します。これは、PHP などの他の言語ではデフォルトで同期 (ブロッキング) である I/O 操作に最適です。ノード net.socket API の場合、ソケット I/O を処理するいくつかの API メソッドに対してイベントがトリガーされ、イベントが発生すると、これらのメソッドにパラメーターによって渡されるコールバックがトリガーされます。イベントには、さまざまな方法でコールバック関数をバインドできます。コールバック関数をパラメーターとして受け入れることは、開発者にとって便利なだけです。

最後に、OS イベントと nodejs イベントを混同しないでください。net API の場合、OS イベントは nodejs ランタイムに渡されますが、nodejs イベントは javascript です。

これが役立つことを願っています。

于 2011-10-02T01:58:42.627 に答える