setImmediate vs setTimeout vs process.NextTick
setTimeout(() => console.log('timeout'),0);
setImmediate(() => console.log('immediate'));
process.NextTick(() => console.log('nextTick'));
console.log('current event loop');
처리되는 단계
setTimeout(), setInterval()은 Timers 단계에서 처리
setImmediate()는 Check 단계에서 처리
process.NextTick()은 이벤트 루프 시작 시와 이벤트 루프의 각 단계에서 처리
process.NextTick() 재귀 호출 시 이벤트 루프 block
주어진 단계에서 process.NextTick()이 호출되면 이벤트 루프가 계속되기 전에 process.NextTick()에 전달된 모든 콜백이 해결된다. 이렇게 process.NextTick()이 재귀적으로 호출되면 이벤트 루프를 차단하게 된다. 큐에 계속해서 process.NextTick()이 쌓여 다음 일을 처리하지 못하기 때문이다.
let count = 0;
const cb = () => {
console.log(`Processing nextTick cb ${++count}`);
}
setImmediate(() => console.log('setImmediate is called'));
setTimeout(() => console.log('setTimeout executed'), 100);
process.NextTick(cb);
console.log('start');
// 실행 결과
// start
// Processing nextTick cb 1
// Processing nextTick cb 2
// Processing nextTick cb 3
// ...
setImmediate() 재귀 호출 시?
let count = 0;
const cb = () => {
if (count < 2000) {
console.log(`Processing nextTick cb ${++count}`);
setImmediate(cb);
}
}
setImmediate(cb);
setTimeout(() => console.log('setTimeout executed'), 100);
process.NextTick(cb);
console.log('start');
// 중간에 setTimeout 콜백함수가 실행된다. 몇 번째인지는 랜덤.
=> setImmediate()가 재귀적으로 호출되더라도 이벤트 루프를 차단하지 않으며 지정된 시간이 지나면 setTimeout 이벤트가 실행된다.
setImmediate, process.NextTick 이름
기본적으로 서로의 이름이 바뀌어야 한다.(https://nodejs.org/en/guides/event-loop-timers-and-nexttick#setimmediate-vs-settimeout 참고)
왜냐하면 process.NextTick()이 setImmediate()보다 더 즉시 발생하기 때문이다. 그렇지만 현재는 이 둘 의 이름을 바꿀 수는 없다. 왜냐하면 이 둘의 이름을 바꾼다면 이 둘을 사용하는 대다수의 npm 패키지가 망가질 수 있기 때문이고, 매일 새로운 모듈이 더해지고 있으므로 잠재적으로 더 많은 npm 패키지가 깨질 수 있기 때문이다. 그래서 이 둘의 이름은 바꿀 수가 없다.
모든 경우에 setImmediate()를 사용하기를 권하는데, 사용하기 쉽고 brower 등의 다양한 환경에서 호환이 더 잘되기 때문이다.
setTimeout() vs setImmediate()
setImmediate()는 poll 단계가 완료되면 스크립트를 실행하도록 설계되었다. setTimeout()은 최소 임계값(ms)가 경과한 후 스크립트가 실행되도록 예약한다.
setTimeout(() => {
console.log('setTimeout');
}, 0);
setImmediate(() => {
console.log('setImmediate');
});
I/O 사이클 외에서 둘을 같이 호출
두 타이머가 실행되는 순서는 프로세스 성능에 의해 제한되기 때문에 비결정적이다. => 누가 빨리 출력될지는 랜덤
I/O 사이클 안에서 둘을 같이 호출
I/O 주기 내에서 두 타이머를 호출하면 setImmediate() 콜백이 항상 먼저 실행된다.
setTimeout()보다 setImmediate()를 사용하는 주요 이점은 존재하는 타이머 수와 관계없이 I/O 주기 내에서 예약된 경우 setImmediate()가 항상 타이머보다 먼저 실행된다는 것이다.
'NODE.JS' 카테고리의 다른 글
[Node.js] Module (0) | 2024.01.15 |
---|---|
[Node.js] Event Emitter (0) | 2024.01.12 |
[Node.js] Event Loop Phase 더 알아보기 (0) | 2024.01.12 |
[Node.js] Event Loop (이벤트 루프) (0) | 2024.01.12 |
[Node.js] node.js가 비동기를 처리하는 방법 (0) | 2024.01.12 |
setImmediate vs setTimeout vs process.NextTick
setTimeout(() => console.log('timeout'),0);
setImmediate(() => console.log('immediate'));
process.NextTick(() => console.log('nextTick'));
console.log('current event loop');
처리되는 단계
setTimeout(), setInterval()은 Timers 단계에서 처리
setImmediate()는 Check 단계에서 처리
process.NextTick()은 이벤트 루프 시작 시와 이벤트 루프의 각 단계에서 처리
process.NextTick() 재귀 호출 시 이벤트 루프 block
주어진 단계에서 process.NextTick()이 호출되면 이벤트 루프가 계속되기 전에 process.NextTick()에 전달된 모든 콜백이 해결된다. 이렇게 process.NextTick()이 재귀적으로 호출되면 이벤트 루프를 차단하게 된다. 큐에 계속해서 process.NextTick()이 쌓여 다음 일을 처리하지 못하기 때문이다.
let count = 0;
const cb = () => {
console.log(`Processing nextTick cb ${++count}`);
}
setImmediate(() => console.log('setImmediate is called'));
setTimeout(() => console.log('setTimeout executed'), 100);
process.NextTick(cb);
console.log('start');
// 실행 결과
// start
// Processing nextTick cb 1
// Processing nextTick cb 2
// Processing nextTick cb 3
// ...
setImmediate() 재귀 호출 시?
let count = 0;
const cb = () => {
if (count < 2000) {
console.log(`Processing nextTick cb ${++count}`);
setImmediate(cb);
}
}
setImmediate(cb);
setTimeout(() => console.log('setTimeout executed'), 100);
process.NextTick(cb);
console.log('start');
// 중간에 setTimeout 콜백함수가 실행된다. 몇 번째인지는 랜덤.
=> setImmediate()가 재귀적으로 호출되더라도 이벤트 루프를 차단하지 않으며 지정된 시간이 지나면 setTimeout 이벤트가 실행된다.
setImmediate, process.NextTick 이름
기본적으로 서로의 이름이 바뀌어야 한다.(https://nodejs.org/en/guides/event-loop-timers-and-nexttick#setimmediate-vs-settimeout 참고)
왜냐하면 process.NextTick()이 setImmediate()보다 더 즉시 발생하기 때문이다. 그렇지만 현재는 이 둘 의 이름을 바꿀 수는 없다. 왜냐하면 이 둘의 이름을 바꾼다면 이 둘을 사용하는 대다수의 npm 패키지가 망가질 수 있기 때문이고, 매일 새로운 모듈이 더해지고 있으므로 잠재적으로 더 많은 npm 패키지가 깨질 수 있기 때문이다. 그래서 이 둘의 이름은 바꿀 수가 없다.
모든 경우에 setImmediate()를 사용하기를 권하는데, 사용하기 쉽고 brower 등의 다양한 환경에서 호환이 더 잘되기 때문이다.
setTimeout() vs setImmediate()
setImmediate()는 poll 단계가 완료되면 스크립트를 실행하도록 설계되었다. setTimeout()은 최소 임계값(ms)가 경과한 후 스크립트가 실행되도록 예약한다.
setTimeout(() => {
console.log('setTimeout');
}, 0);
setImmediate(() => {
console.log('setImmediate');
});
I/O 사이클 외에서 둘을 같이 호출
두 타이머가 실행되는 순서는 프로세스 성능에 의해 제한되기 때문에 비결정적이다. => 누가 빨리 출력될지는 랜덤
I/O 사이클 안에서 둘을 같이 호출
I/O 주기 내에서 두 타이머를 호출하면 setImmediate() 콜백이 항상 먼저 실행된다.
setTimeout()보다 setImmediate()를 사용하는 주요 이점은 존재하는 타이머 수와 관계없이 I/O 주기 내에서 예약된 경우 setImmediate()가 항상 타이머보다 먼저 실행된다는 것이다.
'NODE.JS' 카테고리의 다른 글
[Node.js] Module (0) | 2024.01.15 |
---|---|
[Node.js] Event Emitter (0) | 2024.01.12 |
[Node.js] Event Loop Phase 더 알아보기 (0) | 2024.01.12 |
[Node.js] Event Loop (이벤트 루프) (0) | 2024.01.12 |
[Node.js] node.js가 비동기를 처리하는 방법 (0) | 2024.01.12 |