これは私の以前の質問Node.js Non Blocking Natureに続くものです. Node.js で何が起こっているのかを完全に理解しているとはまだ思えません。ノードがユーザーから大きなファイルのアップロードのリクエストを受け取ったとしましょう。ここで、コールバックでファイルを処理するコードを配置して、非同期にすると言います。次は何が起こる ?コールバックが、Node.js アプリが処理する必要があるイベントの大きなリストに入れられたとしましょう。これまでのところ、ブロックされていません。しかし、ある時点でコールバックがイベント ループから引き出され、コードの実行が開始されます (ファイルのアップロードまたはダウンロードなど)。今何?Node.js アプリは現在ブロックされていますか? もしそうなら - どうすればアプリのパフォーマンスが損なわれず、そうでなければ - 誰が「ジャンプ」を担当していますか 異なるイベントとリクエストの間?Apacheまたは同様のサーバーには、すべてのスレッドを処理する(それらのタイミングを計る)特別なコードがあるため、スレッドが他のすべてをチョークすることはありません.ただし、ノードでは、私が理解しているように、イベントループがあります. ファイル I\O が終了すると、コールバックが魔法のように準備完了のファイルを返します。それにもかかわらず、サーバーは依然として I\O を実行する必要があり、それを回避することはできません! イベント ループ内のコードはタイミングを計っていますか? たとえば、異なるイベント (コールバックなど) 間をジャンプして、要求が他のイベントをチョークしないようにしますか? もしそうなら、どのように?イベント ループ内のコードはタイミングを計っていますか? たとえば、異なるイベント (コールバックなど) 間をジャンプして、要求が他のイベントをチョークしないようにしますか? もしそうなら、どのように?イベント ループ内のコードはタイミングを計っていますか? たとえば、異なるイベント (コールバックなど) 間をジャンプして、要求が他のイベントをチョークしないようにしますか? もしそうなら、どのように?
3 に答える
すべての I/O は、複数のスレッドを使用して node.js によって内部的に処理されます。これは、シングル スレッド、イベント ベース、および非同期の I/O 機能へのプログラミング インターフェイスです。
したがって、例の大きなアップロードは、node.js によって管理される別のスレッドによって実行され、そのスレッドが作業を完了すると、コールバックがイベント キューに置かれます (単一の JavaScript スレッドによって実行されます)。
単一の JavaScript スレッドは、キューの先頭からコールバックを取得し、キューが空になるまで連続して実行するものと考えてください。その後、内部 I/O スレッドの 1 つが新しいコールバックをキューに入れるまでスリープします。
この記事process.nextTick
では、これらの詳細の一部を理解するのに役立つ関連トピックについて説明します。
node.js はしばしば「ノンブロッキング」と表現されますが、それが実際に意味することは、 i/o でブロックしないということです。プロセッサを集中的に使用する必要がある場合は、確かに、他のことを待たなければなりません。ただし、ファイル システムまたはネットワークからデータが返されるのを待っているだけの場合、ノードはプロセスをブロックしません。
処理中のファイルのアップロードが遅い場合、データが入ってくると、定期的に何かを行う必要があります (コールバックを呼び出す可能性がありますが、コールバックを呼び出すのに十分になるまでそのデータを保存するだけの可能性があります)。しかし、コンピューターは高速であり、何が起こっても、すべての意図と目的のために瞬時に発生します。私たちが懸念しているのは、ネットワーク操作が比較的遅いという事実です。Php のような言語では、通常、この操作が完了するまで関数は戻りません。それが完了するまで、そのスクリプトでできることは他にありません。その間、CPU はアイドル状態にある可能性があります...単にネットワークを介してデータが着信するのを待っているだけです。一方、ノードでは、コールバックが呼び出される前に、CPU を他のことに使用できます。
他の人が指摘したように、ボンネットの下でスレッドが発生している可能性があります. または、ノードがノンブロッキング C++ 関数を使用してファイルおよびネットワーク操作を内部的に実装できるため、存在しない可能性があります。関係ない。重要なことは、I/O 操作がアプリ内での他の処理を妨げないことです。
この主題は(少なくとも初心者にとっては)完全に読むに値するほど複雑であり、5行の回答を読んでも理解できないと思います。これは私が見つけた最高のリソースですhttp://www.theserverside.com/discussions/thread.tss?thread_id=61693 。彼は Node.js をそれほど高く評価していませんが、それを説明するのに多くの労力を費やしています。私の意見では読む価値があります。