ティックは、nodejsイベントループがキュー内のすべてを実行することを決定する実行単位であると読みましたが、process.nextTick()
どのイベントがnode.jsイベントループに新しいティックの処理を開始させるかを明示的に言う以外は? I/O待ちですか?CPUバウンド計算はどうですか?それとも、新しい関数に入るたびですか?
2 に答える
process.nextTick()
Node.JS が新しいティックを開始する原因にはなりません。提供されたコードが次のティックを待機するようにします。
これは、それを理解するための優れたリソースです: http://howtonode.org/understanding-process-next-tick
ティックのイベントを取得する限り、ランタイムがそれを提供するとは思いません。次のように「偽造」できます。
var tickEmitter = new events.EventEmitter();
function emit() {
tickEmitter.emit('tick');
process.nextTick( emit );
}
tickEmitter.on('tick', function() {
console.log('Ticked');
});
emit();
編集: 他のいくつかの質問に答えるために、別の投稿で例外的なデモンストレーションを行っています: Node.js イベント ループ ティックとは正確には何ですか?
nextTick
現在実行中の Javascript が制御をイベント ループに戻すとき (たとえば、実行を終了するとき) に呼び出されるコールバックを登録します。CPU バウンド操作の場合、これは関数が終了したときになります。非同期操作の場合、これは非同期操作が開始され、他の即時コードが実行されたときになります (ただし、非同期操作自体が完了したときではなく、イベント キューからのサービスが終了したときにイベント キューに移動します)。 .
のnode.jsドキュメントからprocess.nextTick()
:
現在のイベント ループ ターンが完了するまで実行されたら、コールバック関数を呼び出します。
これは setTimeout(fn, 0) の単純なエイリアスではなく、はるかに効率的です。これは、イベント ループの後続のティックで追加の I/O イベント (タイマーを含む) が発生する前に実行されます。
いくつかの例:
console.log("A");
process.nextTick(function() {
// this will be called when this thread of execution is done
// before timers or I/O events that are also in the event queue
console.log("B");
});
setTimeout(function() {
// this will be called after the current thread of execution
// after any `.nextTick()` handlers in the queue
// and after the minimum time set for setTimeout()
console.log("C");
}, 0);
fs.stat("myfile.txt", function(err, data) {
// this will be called after the current thread of execution
// after any `.nextTick()` handlers in the queue
// and when the file I/O operation is done
console.log("D");
});
console.log("E");
出力:
A
E
B
C
D