Node.jsのイベントループ

Node.jsのイベントループについて

JavaScriptはシングルスレッドなので「並行処理」を行うために、「ノンブロッキングI/O」で「非同期処理」を実現しており
Node.jsはイベントループと呼ばれるモデルを採用しています。

イベントループのイベントキューにイベントが登録され、イベントハンドラを実行します。
イベントハンドラの完了した結果は、イベントキューにコールバック関数を登録することで受け取ります。

そのため、シングルスレッドでブロックするI/Oを行った場合、そのイベント完了後に次のイベントが実行されてしまう。
並行処理させるためには、ノンブロッキングI/Oを使ってイベントの完了を待たずに次のイベントハンドラを実行させます。

Node.jsはイベントを生成と処理の制御を行うので
ファイルのリード、DBへのクエリ発行、HTTPサーバがリクエストを受けた時などにイベントが生成されます。

例えばテストファイルを作って試すとわかります。

test.js

var oHttp = require('http');
var oFs = require('fs');
oHttp.createServer(function(req, res) {
    console.log("Start");
    oFs.readFile('index.txt', function(err, content) {
        res.writeHead(200, { 'Content-Type':'text/html; charset=utf-8' });
        res.end(content);
        console.log("Response");
    });
    console.log("End");
}).listen(8080, '127.0.0.1');
console.log('ListenStart');

読み込むファイル

<html/>
 <head/>
   <title/>index</title/>
 </head/>
  <body/> みれた? </body/>
</html/>

実行

[root@dti-vps-srv34 ~]#node test.js

ブラウザで「http://127.0.0.1:8080」にアクセス。

[root@dti-vps-srv34 ~]#node test.js
ListenStart
Start
End
Response

EndがResponseより先になっています。
これはreadFile()にコールバック関数を登録しているので、非同期となり
読み込み完了した時点で関数が呼び出されているからです。

プログラムの書き方によっては非同期の部分をロックしてしまうので注意。

New Posts
Android APIよく忘れるのでメモ

Android 1.0 1 Base Android 1.1 2 Base1.1 Android 1.5 3 Cupcake Android 1.6 4 Donut Android 2.0 5 Eclair Android 2.0.1 6 Eclair 0.1 Android 2.1.x 7 Eclair mr1 Android 2.2.x 8 Froyo Android 2.3 9 Gingerbread Android 2.3.1 Android 2.3.2 Android 2.3.3 10 Gingerbread mr1 Android 2.3.4 Andr

Android minSdkVersion の引き上げ

昔のアプリを久しぶりに修正しようと思ったら、minSdkVersionを引き上げる必要があった。 Error:Execution failed for task ':flatalk:processDebugManifest'. > Manifest merger failed : uses-sdk:minSdkVersion 9 cannot be smaller than version 14 declared in library [com.android.support:appcompat-v7:26.0.0-alpha1] /Users/admin/.android/build-cache/df7faf3c442bb6a7448aef64241ef184a528/output/An

Cordova Android Runtime Permission Plugin - cordova-plugin-android-permissionsでパーミッション要求が行われない。 requestPermission is not work

cordova-plugin-android-permissions permissions.requestPermission(successCallback, errorCallback, permission); ステップ実行で確認すると、hasPermissionではstatus.hasPermissioがFALSEになっているのですが 、デバック実行しても、パーミション要求が動かないことがありました。 原因はpluginの入れ替えで、要求するパーミンションがAndroidManifest.xmlから消えていたのが原因でした、Manifestに無いパーミッションはリクエストしても要求画面は開きません。 cordova-plugin-cameraを入れ直した際に、Manif

Youtube API - ユーチューブのカテゴリを取得する( VideoCategories: list)

GET https://www.googleapis.com/youtube/v3/videoCategories partのみ必須になっていたけど、regionCodeも必要だった。。今回はJPを指定。 参照:https://developers.google.com/youtube/v3/docs/videoCategories/list#try-it { "kind": "youtube#videoCategoryListResponse", "etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/siiWQ_WM0OtxtxK7NUUJKFwqDRc\"", "items": [ { "kind": "youtube#videoC

Cordova Plugin作成 ( plugin.xml記載ミスでassets全部消えた。。)

<resource-file src="res/assets/cordova-plugin-4assets.js" target="assets" /> target-dirとtargetを記載ミスしてました。 正しくは、 <resource-file src="res/assets/cordova-plugin-4assets.js" target="assets/cordova-plugin-4assets.js" /> <resource-file src="res/assets/cordova-plugin-4assets.js" target-dir="assets/" /> プラグイン削除時にtargetも消されるので、assetsご


Share Link

Web Contents & Apps


Tags


Posts


Category