process.nextTickとはなんぞ

公式マニュアルのprocessを眺めていたらprocess.nextTickというのが出てきました。なんだかとても大事らしいです。

マニュアルによればコレは、

イベントループの次以降のループでコールバックを呼び出します。 これは setTimeout(fn, 0) の単純なエイリアスではなく、 はるかに効率的です。

process Node.js v0.8.8 Manual & Documentation

setTimeout(fn, 0)の単純なエイリアス」と書いている辺り、どうもタスクの類のお話らしいです。要するに「JavaScriptはシングルスレッドなので、ウェブブラウザでいえば、単にwhileループするだけだとページがハングする*1から、アニメーションする時などにはsetTimeout/setInterval使いましょう」と同類の話だと思います。キューの話については、ここが非常に参考になります。

例えば、

setInterval () ->
	console.log "hoge"
, 1000

while true
	do -> # something

上記の場合だと、whileループのタスクが終わらず、setIntervalで指定した関数が実行されることはありません。そこで

setInterval () ->
	console.log "---- hoge ----"
, 1000

process.nextTick () ->
	i = 0;
	while i++ < 1000000 # 適当に調整
		do -> # something
	console.log "@@@@ piyo @@@@"
	process.nextTick arguments.callee

setTimeoutによる無限ループと同様に、上記のようにすると、どちらも実行されることが分かります。

まとめると、「 はるかに効率的なsetTimeout(fn, 0)エイリアス」と覚えておけばよさそうです。

*1:タスクが終わらずキューが消費されないので、入力イベントや描画処理のタスクが実行がされないため