ホームページ >ウェブフロントエンド >jsチュートリアル >Node.js コードの実行方法
今回は、Node.js コードの実行原理と、Node.js コードを実行する際の 注意事項 について説明します。以下に実際のケースを示します。
ソフトウェアが正常にダウンロードされてインストールされた後、それは実際にはコンピューターのハードドライブに保存されている単なるマシンコードの集まり、つまり、私たちが見ることができる一連の exe ファイルです。 もちろん、一部のソフトウェアは比較的大きいものです。大量の dll ファイルが含まれている可能性があります。 このソフトウェアを実行するには2つの方法があります: QQ、Feiqiu、Chromeブラウザなどのほとんどのソフトウェアは、ダブルクリックで実行して実行できます。 node.js など、一部のソフトウェアはコマンドラインで実行する必要があります。 ソフトウェアが実行されると、オペレーティング システムは対応するプロセスを作成します。プロセスは生きたソフトウェアであると理解できます。 プロセスとスレッド コンピューターの中核は CPU であり、すべてのコンピューティング タスクを実行します。それは工場のようなもので、常に稼働していると仮定すると、工場の電力は限られており、一度に 1 つの作業場のみが使用できます。言い換えれば、1 つのワークショップが動作し始めると、他のワークショップも動作を停止する必要があります。その背後にある意味は、1 つの CPU は一度に 1 つのタスクしか実行できないということです。プロセスは工場の作業場に似ており、CPU は常に 1 つのプロセスを実行し、他のプロセスは非実行状態になります。ワークショップでは、多くの作業員が協力してタスクを完了することがあります。スレッドはワークショップのワーカーのようなもので、プロセスには複数のスレッドを含めることができます。ワークショップ内のスペースはワーカーによって共有されます。これは、プロセスのメモリ空間が共有され、各スレッドがこれらの共有メモリを使用できることを意味します。ただし、各部屋の広さは異なります。トイレなど、人がいる場合は他の人は入れない場合もあります。これは、スレッドが共有メモリを使用する場合、他のスレッドはそのメモリを使用する前に共有メモリの終了を待つ必要があることを意味します。他人の侵入を防ぐ簡単な方法は、ドアに鍵を追加することです。最初に到着した人はドアに鍵を掛け、鍵を見てドアに並び、鍵が開くのを待ちます。これを相互排他ロックと呼びます。
JavaScript はシングルスレッドなのですか?
JavaScript 言語の主な特徴は、シングルスレッドであることです。つまり、一度に 1 つのことしか実行できません。では、なぜ JavaScript は複数のスレッドを持てないのでしょうか?これにより効率が向上します。 JavaScript は、その目的に応じてシングルスレッドです。ブラウザーのスクリプト言語としての JavaScript の主な目的は、ユーザーと対話して DOM を操作することです。これにより、シングルスレッドのみが可能であることが決まります。そうでない場合は、非常に複雑な同期の問題が発生します。たとえば、JavaScript に同時に 2 つのスレッドがあるとします。1 つのスレッドが特定のDOM ノード にコンテンツを追加し、もう 1 つのスレッドがこのノードを削除するとします。この場合、ブラウザーはどちらのスレッドを使用する必要がありますか?
そのため、複雑さを避けるために、JavaScript は誕生以来シングルスレッドであり、これがこの言語の中心的な機能となっており、今後も変更されることはありません。 JavaScript はシングルスレッドです。マルチスレッドを実現できるワーカーやクラスターなどもありますが、これらは機能が限定されたスレッドを作成するために使用され、依然としてメインスレッドによって制御されます。ネジ付き。 さらに、JavaScript はシングルスレッドですが、Node.js がインスタンスを実行した後はシングルプロセスでマルチスレッドになるという意味ではないことを理解する必要があります。は、V8 エンジンの解析を担当するスレッドです。JavaScript では、一部のスレッドが libuv を担当します。これは、イベント ループとして理解されます。 IOの理解方法: Iは入力、入力:ファイルの読み取り、データのAjaxリクエストの開始などを表しますOは出力、出力を表します:ファイルの書き込みなど
var a = 1;var b = 2;function fn(){}以下は非同期コードです:
fs.readFile('./a.js',callback); fs.writeFile('./b.js',callback);ブラウザ側で見られる多数のコードを含む マウス、キーボード イベント、アヤックスなど。 Node.js の非同期オブジェクトのほとんどは、event.eventEmitter イベント オブジェクトから継承されます コードを実行する Node.js のメカニズムを理解します Node.js プロセスをレストランとして想像できます: シェフの代表者JavaScript メインスレッドは、完了するまでメインスレッド上で同期コードの実行に忙しくなります。
//同步代码var a = 1;//同步代码var b = 2;//异步代码fs.readFile('./a.js',function(err,data){ if(err)throw data; });//同步代码var c = 3;//异步代码setTimeout(function(){ },200);//同步代码console.log(a + b + c);//同步代码function fn(){ console.log('abc'); }//异步代码fs.writeFile('./b.js',myData,function(err){ if(err)throw err; });たとえば、上記のようなコードは、同期コードに遭遇すると、シェフに直接渡されて完了しますが、非同期コードに遭遇すると、この時点では実行されません。 、しかし、このようなものです 新しいゲストのように、彼はそれをウェイターに渡し、ウェイターはゲストが注文した料理を登録しました。これは、この非同期コードをイベントとして扱い、イベントキューに記録することに相当します。
時間が近づくと、すべての同期コードが実行され、この時点でメイン スレッドがアイドル状態になり、このイベント ループ スレッドが開始され、どのゲストが登録されているかが確認されます。ウェイターが料理を注文すると、優先順位に従って料理を 1 つずつ揚げ始めます。つまり、ゲストが多く、ゲストごとに要件が異なるため、Node.js コードが実行されます。にはタイマー、ファイルの読み取り、ファイルのフェッチ、ネットワーク リクエストなどのさまざまな非同期コードがあるため、Node.js にはこれらの非同期コードを処理するためのスレッド プールが多数あります。
スレッドプール内の特定のスレッドを担当する非同期実行が完了すると、このイベントの完了と同等になり、このイベントに対応するコールバック関数がメインスレッドの背後でキューイングされます。
メインスレッドで実行される新しいコードがあると、シェフは何かやるべきことがあることがわかるとすぐに作業を開始します。
メインスレッド上で実行されたコールバック関数に対応するコードが新たな非同期コードを生成すると、イベントループに登録されます。
ある瞬間まで、イベント キュー内のすべてのイベントが実行され、スレッド プールはゆっくりと空になります。
node.js は process.exit() を呼び出し、オペレーティング システムは現在の node.js プロセスを破棄します。
基本的には上記の内容を理解するだけで十分です。さらに一歩進んでみましょう:
ネットワーク プログラミングの学習の部分に到達すると、CTRL + C を積極的に使用して現在のコンテナーを変更しない限り、サーバー コンテナーについて理解できることがわかります。 one プロセスは終了します。そうでない場合は、クライアントの接続を待ち続け、対応するルートに従って対応する処理を実行します。
これをどう理解すればよいでしょうか?
jQuery で学んだ API を思い出してみましょう: イベントを監視するには 2 つの方法があります:
1 回限りの監視
無制限の監視
このように理解できます: ほとんどのファイル操作、Ajax など。実際には 1 回行うだけで終わり、2 回目はありません。これらは 1 種類のイベント モデルに相当します。
しかし、ソケットや http などのネットワーク プログラミングが含まれる場合、それは無制限の監視に相当します。
この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。
推奨読書:
angularjs での $apply() の使用の詳細な説明
以上がNode.js コードの実行方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。