私はスタックオーバーフローについて同様の質問を見ましたが、それらのどれも私が持っている質問に完全に飛び込むことはありませんか?私はイベントキュー、それらがどのように機能するか、そしてそれらを実装することに精通しています。私はnode.jsを初めて使用し、Node.jsの実行方法に頭を悩ませようとしています。
C ++アプリケーションでは、次のように実行します。
int main(){
std::vector<Handler*> handlers;
BlockingQueue queue = new BlockingQueue();
//Add all the handlers call constructors and other such initialization
//Then run the event loop
while(true){
Event e = queue.pop();
for( std::vector<Handler>::iterator it = handlers.begin(); it != handlers.end(); ++it){
*it.handle(e);
}
}
}
node.jsの場合、次のようなmain.jsというメインファイルがあるかもしれません。
var http = require("http");
function main(){
// Console will print the message
console.log('Server running at http://127.0.0.1:8080/');
var server = http.createServer(function (request, response) {
// Send the HTTP header
// HTTP Status: 200 : OK
// Content Type: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
// Send the response body as "Hello World"
response.end('Hello World\n');
});
server.listen(8080);
console.log('Main completed');
}
main();
server.listenがハンドラーをイベントキューにアタッチしており、c ++の例と同様のコールバックを追加していることを理解しています。
私の質問はです。イベントキューはどこにありますか?それはどこかのJavaScriptにありますか、それともインタープリターに組み込まれていますか?また、メインイベントループに関連してメイン関数はどのように呼び出されますか?
イベントキューはどこにありますか?それはどこかのJavaScriptにありますか、それともインタープリターに組み込まれていますか?
イベントキューは、Javascriptインタープリターをホストするオペレーティング環境に組み込まれています。これはJavascript自体の基本ではないため、実際のJSランタイムの一部ではありません。これを示す興味深い指標の1つsetTimeout()
は、実際にはECMAScriptの一部ではなく、ホストによってJavascript環境で利用できるようになっていることです。
node.jsのJavascript実装を取り巻くシステムは、外部でトリガーされたイベント(タイマー、ネットワーキング結果など)を追跡し、Javascriptが何かの実行に忙しくなく、外部イベントが発生すると、関連するJavascriptコールバックをトリガーします。Javascriptが何かの実行でビジー状態の場合、Javascriptはそのイベントをキューに入れ、Javascriptがビジー状態でなくなるとすぐに、キュー内の次のイベントをトリガーできるようにします。
node.js自体libuv
がイベントループに使用します。あなたはここでそれについてもっと読むことができます。これは、node.js用に開発されたイベント型の非同期I / Oを実行するマルチプラットフォームの方法を提供しますが、他のいくつかのプロジェクトでも使用されています。
これも役立つかもしれない関連する答えです:
ノードでコールバックを待っている間に任意のコードを実行しますか?
また、メインイベントループに関連してメイン関数はどのように呼び出されますか?
node.jsが起動すると、実行する初期スクリプトファイルが提供されます。そのスクリプトファイルをメモリにロードし、その中のJavascriptを解析して実行します。あなたの特定の例では、それは関数main
を解析させ、次にその実行がmain()
その関数を実行する原因になります。
起動時にノードに渡されるスクリプトファイルの読み込み、解析、実行は、node.jsに与えられるタスクです。イベントキューとはまったく関係ありません。一部のnode.jsアプリケーションでは、最初のスクリプトを実行してから終了します(作業は終了します)。他のnode.jsアプリケーションでは、最初のスクリプトがタイマーやサーバーなどを開始し、将来的にイベントを受信します。その場合、node.jsは最初のスクリプトを最後まで実行しますが、作成された永続的なオブジェクトがあり、イベント(この場合はサーバー)をリッスンしているため、nodejsはアプリをシャットダウンしません。これらの将来のイベントが発生したときに受信できるように、実行したままにします。
ここで欠けている部分の1つは、作成したサーバーオブジェクトのようなものを使用すると、特定のイベントが発生したときに1回以上呼び出されるコールバックを登録できることです。この動作はJavascriptに組み込まれていません。代わりに、これらのオブジェクトまたはそれらが使用するTCP関数を実装するコードは、登録されているコールバックのリストを維持する必要があり、これらのイベントが発生すると、適切なコールバックが呼び出されて適切なデータが渡されるようにコードを実行する必要があります。の場合http.createServer()
、それを機能させるのは、nodejshttpライブラリ内のJavascriptとネイティブコードの組み合わせです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加