大津です。

> while(true) で回すのではなく process.nextTick() で再帰的にカウンター
> を回せば、おそらくシグナルウォッチャーのコールバックを受けることが
> できるはずです。

こんなこと書いちゃって process.nextTick() の再帰処理を使うコードが増えて
しまっているかもしれないので、かなり早めに注意事項をお知らせしておきます。

一昨日 isaacs から process.nextTick() の動作仕様を変更する提案がなされま
した。

"process.nextTick semantics"
https://groups.google.com/group/nodejs-dev/browse_thread/thread/ef10d80af0db9bc?hl=ja

"process.nextTick should be cleared after every v8 invocation"
https://github.com/joyent/node/issues/3335

要点としては、

・process.nextTick() でイベントハンドラを追加するのはよくやることだけど
次のイベントループでハンドラが登録されるまでの間にイベントが発生したりす
ると取りこぼしが起きてしまう。
・次のイベントが発生する前に確実にハンドラを登録をするために、V8でJSを実
行した直後に process.nextTick() に登録された関数(nextTickQueue)を全部実
行するようにしたい。
・再帰処理とかの展開もそこで行うので次のようなコードでは setTimeout() は
起動しなくなるよ。(nextTick の再帰ループがずっと動く event loop
starvation と言ってます。)

setTimeout(function() {
  console.log('timeout');
});
process.nextTick(function f() {
  process.nextTick(f);
}, 1000);

この動作変更により先日例示した process.nextTick() の再帰処理を使うコード
が将来的に動かなくなる可能性があります。(動いても動作挙動が変わるかもし
れません。)

まだ議論が始まったばかりですが、node-v0.8 までは現状の挙動のままにするけ
ど node-v0.9からは変えるかもという話です。
今もし process.nextTick() の再帰処理の実装をされている/しようという方が
いらっしゃいましたら今後変わるかもということを頭の隅に入れておいてください。

PRでこのMLで出た例を紹介しましたが、そもそも CPU busy なループを回すのが
bad idea だとのコメントが出ています。
個人的には process.nextTick() の再帰は使うことはないのですが、もし何か
ユースケースなど持っていて今後使えないとホント困るというようなことがあれ
ばPRで紹介しますので、このメールにでも返答してくれればと思います。


メールによる返信