ホームページ > 記事 > ウェブフロントエンド > NodejsのI/Oは何を意味しますか
nodejs では、「I/O」は入力と出力を意味し、通常は「I/O」操作を指します。「I/O」操作は、シングルスレッドのシリアル実行とマルチスレッドの並列実行に分類できます。 、シングルスレッドのインストールは順番に実行され、実行が遅いと後続の実行コードがブロックされます。
この記事の動作環境: Windows 10 システム、nodejs バージョン 12.19.0、Dell G3 コンピューター。
多くの人は Nginx サーバーに精通しています。Nginx は純粋な C で書かれており、Web サーバーおよびリバース プロキシとして使用されます。負荷分散などのサービス面での利点があります。ノードサーバーと Nginx サーバーは、イベント駆動型であるという点で似ています。
ブラウザ上のJavaScriptはシングルスレッドで実行され、UIの描画も同じスレッドで実行されるため、JavaScript実行時にはUIの描画やレスポンスが停滞した状態になるはずです。 (スクリプトの実行時間が 100 ミリ秒を超えると、ユーザーはページがスタックしたように感じます)。このような状況に遭遇した場合、待機の問題を解消するための非同期方法を考えることになりますが、非同期と同期の概念は導入しません。
次に、NodeJS のイベント駆動型およびノンブロッキング I/O 特性を詳しく見てみましょう。これらを理解することは、NodeJS 開発をより良く学び、高パフォーマンスの Web を構築する上で、より深い意味を持ちます。プラットホーム。
1. I/O 操作の概要:
I/O 操作は開発者にとってよく知られたものですが、ここで NodeJS I.O 操作について簡単に説明します。 I/O 操作は、シングルスレッドのシリアル実行とマルチスレッドのパラレル実行に分けられます。どちらの方法にも独自の長所と短所があり、マルチスレッドのコストは、スレッドの作成と実行中のスレッド コンテキストの切り替えに高いコストがかかることと、マルチスレッドではロックと状態の同期の問題に直面することです。シングルスレッドのインストールは順番に実行されるため、実行が遅いと後続の実行コードがブロックされます。タスクのシリアル実行 (概念的には同期実行に似ています) とタスクの並列実行の説明は次のとおりです。
NodeJS で単一のスレッドを使用して、デッドロック、状態同期の問題では、非同期 I/O を使用して単一スレッドがブロックされないようにし、CPU を効率的に使用します。非同期 I/O では、I/O 呼び出しによって後続の操作がブロックされなくなり、I/O 完了までの元の待ち時間が実行に必要な他のビジネスに割り当てられることが期待されます。
一部の開発者は、非同期/同期、ブロッキング/ノンブロッキングの概念について混乱することが多く、この 2 つは関連しません。 I/O のブロックとは、呼び出し後、呼び出しが終了する前に、システム カーネル レベルがすべての操作を完了するまで待機する必要があることを意味します。ノンブロッキング I/O は、呼び出された後すぐに戻ります。ブロッキング I/O とノンブロッキング I/O については、次の図があります:
2. NodeJS 非同期 I/O 分析:
イベントループ: 処理が開始されると、Node は while(true) と同様のループを作成します。ループ本体の各実行の処理は Tick と呼ばれます。各 Tick の処理は時間があるかどうかを確認することです処理されることになります。
オブザーバー: 各タイム ループには 1 つ以上のオブザーバーがあり、処理すべきイベントがあるかどうかを判断するプロセスは、これらのオブザーバーに処理すべきイベントがまだあるかどうかを尋ねることです。
リクエスト オブジェクト: JavaScript から呼び出しを開始して I/O 操作を完了するカーネルへの移行プロセスには、リクエスト オブジェクトである中間生成物が存在します。
I/O スレッド プール: リクエストを組み立て、I/O スレッド プールに送信して実行を待機し、I/O 操作の最初のステップを完了して、コールバック通知の 2 番目の部分に入ります。 。 (Windows では、スレッド プール内の I/O 操作が呼び出された後、取得された結果が req->result 属性に格納され、PostQueuedCompletionStatus() が呼び出されて、現在のオブジェクト操作が完了したことを IOCP に通知します。 )
非同期 I/O は次の図のようになります:
3. NodeJS 非同期プログラミングの例:
Async /O 関連の概念については前に紹介しました。非同期 I/O 操作の例を次に示します:
var config = require('./config.json'); var fs = require("fs"); var http = require('http'); var url_module = require("url"); http.createServer(function (request, response) { var key = url_module.parse(request.url).query.replace('key=', ''); switch (request.method) { case 'GET': // Asynchronous Response Generation fs.readFile(config.dataPath + key, 'utf8', function(err, value) { if (err) { // Return File Not Found if file hasn't yet been created response.writeHead(404, {'Content-Type': 'text/plain'}); response.end("The file (" + config.dataPath + key + ") does not yet exist."); } else { // If the file exists, read it and return the sorted contents var sorted = value.split(config.sortSplitString).sort().join(''); response.writeHead(200, {'Content-Type': 'text/plain'}); response.end(sorted); } }); break; case 'POST': // Synchronously append POSTed data to a file var postData = ''; request .on('data', function (data) { postData += data; }) .on('end', function () { fs.appendFile(config.dataPath + key, postData, function(err) { if (err) { // Return error if unable to create/append to the file response.writeHead(400, {'Content-Type': 'text/plain'}); response.end('Error: Unable to write file: ' + err); } else { // Write or append posted data to a file, return "success" response response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('success'); } }); }); break; default: response.writeHead(400, {'Content-Type': 'text/plain'}); response.end("Error: Bad HTTP method: " + request.method); } }).listen(config.serverPort); console.log('synchronous server is running: ', config.serverPort);
推奨学習: 「nodejs ビデオ チュートリアル 」
以上がNodejsのI/Oは何を意味しますかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。