読者です 読者をやめる 読者になる 読者になる

Understanding process.nextTick()を翻訳してみた。

node.js

process.nextTickを理解し……たかった - 四角革命前夜 を読んで、やっぱりニコニコ超会議で気になる言い方をしていたprocess.nextTickをしっかり理解しようと思ってUnderstanding process.nextTick() - How To Node - NodeJSを読んでみました。

せっかくなので、翻訳した結果を晒しておきます。
翻訳結果

なんとなく、理解したので自分なりの理解をここで紹介します。

process.nextTick()はイベントループを先に進ませて、他にやることがあるなら実行を移譲する仕組みで、大体以下のようなイメージです。
イベントループが以下の様な感じであるとします。
f:id:yosuke_furukawa:20120511235452p:image
本来ならprocess1→process2→process3と実行される予定です。

ここでprocess1をprocess.nextTick(process1)のようにすると実行を委譲し、他の処理を優先し、自分はイベントループの最後に回されます。
f:id:yosuke_furukawa:20120511235510p:image
これで順序が変わり自分の作業は後回しになるというイメージです。誤解を恐れず言うと、ダチョウ倶楽部の「どうぞ、どうぞ」みたいなものですね。

翻訳先にも書いてありますが、process.nextTick()は以下のような場面で使います。

  1. CPU負荷が集中するような処理を実行している時に他のタスクを割り込ませたい場合。(ニコニコ超会議でmesoさん、kobaさんはこの説明をしていました。)
  2. 完全に非同期にコールバックを実行させたい場合。
  3. イベントを発行する場合。

それぞれ翻訳側に細かく書いてみたので参考になれば幸いです。

また、setTimeout関数でも似たような処理ができるのですが、process.nextTickの方が格段に効率的なようです。
ちょっと前のエントリでNodeはCPU優先な処理に向かない、という話がありましたが、これはうまく書いてあげないとCPU優先な処理でイベントループが止まってしまう(イベントループハラスメントと言うそうです)からなんですね。なのでfibonacci数列とか数え上げみたいなCPU優先な処理には適切なタイミングで「どうぞ、どうぞ」して、イベントループに処理を戻してあげる事が重要です。
node-fib/app.js at master · glenjamin/node-fib · GitHub

基本的な事は理解できた気がするのですが、ちょっと気を抜くと変な風に書いちゃってハラスメントを起こしてしまいそうです。この辺りは慣れなんでしょう。process.nextTickはかなり重要な概念であると思います。

参考文献:

ClusterとSocket.IO について -
nodejs_jp | Google グループ

Understanding process.nextTick() - How To Node - NodeJS
process.nextTickを理解し……たかった - 四角革命前夜
process.nextTick - nullpo.printStackTrace();
Re: [nodejs_jp:631] signalの処理について。