情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsのsetImmediate関数とprocess.nextTick関数の違い

処理をその場で実行するのではなく、直後に実行するための方法としてsetImmediate関数を使用する方法とprocess.nextTick関数を使用する方法がありますが、これらの共通点と相違点は何でしょうか?

共通点

setImmediate関数とprocess.nextTick関数はどちらも第1引数として非同期的な処理を関数として受け取り、非同期的な処理をその場で実行するのではなく次のイベントループで実行するという点が共通しています。

そのため、単純に非同期的な処理を次のイベントループで実行したい場合にはどちらを使用しても得られる結果に違いはありません。

しかし、これらは細かい点で幾つか動作に違いがあります。

相違点

1つ目はパフォーマンスです。

process.nextTick関数の方が遥かにパフォーマンスが良いです。

2つ目は非同期的な処理が実行される順番です。

常にprocess.nextTick関数を使用して登録された処理が先に実行され、setImmediate関数を使用して登録された処理は後に実行されます。

また、process.nextTick関数を使用して登録された処理が複数ある場合には先に登録された処理から順番に実行されます。setImmediate関数の場合も同様です。

setImmediate(function () {
    console.log('set-immediate-1');
});

process.nextTick(function () {
    console.log('process-next-tick-1');
});

process.nextTick(function () {
    console.log('process-next-tick-2');
});

setImmediate(function () {
    console.log('set-immediate-2');
});

console.log('start.');

上のコードの実行結果は下のようになります。

C:\work\node>node next-event-loop-1.js
start.
process-next-tick-1
process-next-tick-2
set-immediate-1
set-immediate-2

3つ目はsetImmediate関数やprocess.nextTick関数を入れ子にした場合の動作です。

setImmediate関数に渡した非同期的な処理の内部で再びsetImmediate関数が使用されている場合には内側のsetImmediate関数に渡した非同期的な処理は次の次のイベントループで実行されます。

しかし、process.nextTick関数に渡した非同期的な処理の内部で再びprocess.nextTick関数が使用されている場合には内側のprocess.nextTick関数に渡した非同期的な処理は次のイベントループで外側のprocess.nextTick関数に渡した非同期的な処理の実行が完了した後に実行されます。

そのため、process.nextTick関数の呼び出しがループし続けて、1つのイベントループがいつまでも終了せず、他の処理が実行されないという動作にならないように注意しなければなりません。

var i = 0;
var f = function () {
    i++;
    console.log('set-immediate-' + i);
    if (i < 10) {
        setImmediate(f);
    }
};
setImmediate(f);

var j = 0;
var g = function () {
    j++;
    console.log('process-next-tick-' + j);
    if (j < 10) {
        process.nextTick(g);
    }
};
process.nextTick(g);

console.log('start.');

上のコードの実行結果は下のようになります。

C:\work\node>node next-event-loop-2.js
start.
process-next-tick-1
process-next-tick-2
process-next-tick-3
process-next-tick-4
process-next-tick-5
process-next-tick-6
process-next-tick-7
process-next-tick-8
process-next-tick-9
process-next-tick-10
set-immediate-1
set-immediate-2
set-immediate-3
set-immediate-4
set-immediate-5
set-immediate-6
set-immediate-7
set-immediate-8
set-immediate-9
set-immediate-10

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js