티스토리 뷰

기타

Node.js의 Timers

이지홍 2022. 9. 28. 17:31
반응형

타이머 기능을 제공하는 함수인 setTimeout(), setImmediate(), setInterval()은 노드에서 window 대신 global 객체 안에 들어 있다. 

 

 setTimeout(콜백 함수, 밀리초): 주어진 밀리초(1,000분의 1초) 이후에 콜백 함수를 실행합니다.

 setInterval(콜백 함수, 밀리초): 주어진 밀리초마다 콜백 함수를 반복 실행합니다.

 setImmediate(콜백 함수): 콜백 함수를 즉시 실행합니다.

 

이 타이머 함수들은 모두 아이디를 반환합니다. 아이디를 사용하여 타이머를 취소할 수 있습니다.

 clearTimeout(아이디): setTimeout을 취소합니다.

 clearInterval(아이디): setInterval을 취소합니다.

 clearImmediate(아이디): setImmediate를 취소합니다.

1) setTimeout()

"저장한 시기에" 실행 ~ setTimeout()은 지정한 밀리 초 이후 코드 실행을 스케줄링 하는 데 사용할 수 있다. 이 함수는 브라우저 Javascript API의 window.setTimeout()과 비슷하지만, 코드의 문자열을 실행하려고 전달할 수 없다.

const timeout = setTimeout(() => {
console.log('1.5초 후 실행');
},1500);

설정한 타임아웃 간격은 정확한 밀리초 후 실행되도록 할 수 없다. 이벤트 루프를 블로킹하거나 보유하고 있는 다른 실행코드가 타임아웃의 실행을 다시 뒤로 밀기 때문이다. 선언된 타임아웃 간격보다 더 빨리 실행되지는 않는다는 것만 보장한다.

setTimeout()은 설정한 타임아웃을 참조하는 Timeout 객체를 반환한다. 여기서 반환된 객체로 실행 동작을 변경할 수도 있고(unref()) 타임아웃을 취소할 수도 있다.(clearTimeout())

2) setImmediate()

setImmediate()는 현재 이벤트 루프 주기 끝에 코드를 실행한다. 이 코드는 현재 이벤트 루프의 모든 I/O작업 후 다음 이벤트 루프에 스케줄링된 모든 타이머 이전에 실행된다. 이 코드의 실행은 setImmediate()함수 호출 뒤에 오는 모든 코드는 setImmediate()함수 인자 이전에 실행된다는 의미로 "바로 다음에" 실행한다고 생각할 수 있다.

console.log('before immediate');

setImmediate((arg) => {
  console.log(`executing immediate: ${arg}`);
}, 'so immediate');

console.log('after immediate');

setImmediate()에 전달한 위 함수는 실행할 수 있는 코드를 모두 실행한 후에 실행하고 콘솔 출력은 다음과 같을 것이다. 

before immediate
after immediate
executing immediate: so immediate

 

※ 주의 setImmediate()를 process.nextTick()과 혼동하지 마라. 서로 다른 점이 몇가지 있다면, 첫 째로 process.nextTick()은 모든 스케줄링된 I/O 이전뿐만 아니라 설정한 모든 immediate 이전에 실행될 것이다. 두번째로 이것은 취소할 수 없으므로 일단 이것으로 코드를 실행하도록 스케줄링하면 일반 함수처럼 실행을 멈출 수가 없다.

3)setInterval()

여러 번 실행해야 하는 코드 블록이 있다면 setInterval()을 사용할 수 있다. setInterval()은 두번째 인자로 지정한 밀리 초 단위의 지연시간으로 무한대로 실행할 함수를 인자로 받는다. setTimeout()처럼 지연시간 다음에 부가적인 인자를 지정할 수 있고, 이는 함수 호출에 전달될 것이다. 또한 setTimeout()처럼 작업이 이벤트 루프에서 진행중일 수 있으므로 지연시간이 보장되지 않는다. 그러므로 대략적인 지연시간으로 생각해야한다. 그러므로 대략적인 지연시간으로 생각해야 한다.

function intervalFunc() {
  console.log('Cant stop me now!');
}

setInterval(intervalFunc, 1500);

 

위 예제에서 intervalFunc()는 중단하기 전까지는 1500밀리 초마다 실행될 것이다. setTimeout처럼 setInterval도 설정한 인터벌을 참조하고 수정하는데 사용할 수 있는 Timeout 객체를 반환한다.

4) 취소하기 

위의 객체를 취소하고 싶다면 각각의 clear함수에 이 객체들을 전달해서 해당 객체의 실행을 환전히 중단할 수 있다. 각각의 함수는 clearTimeout(), clearInterval(), clearImmediate() 이다.

const timeoutObj = setTimeout(() => {
  console.log('timeout beyond time');
}, 1500);

const immediateObj = setImmediate(() => {
  console.log('immediately executing immediate');
});

const intervalObj = setInterval(() => {
  console.log('interviewing the interval');
}, 500);

clearTimeout(timeoutObj);
clearImmediate(immediateObj);
clearInterval(intervalObj);

5) 타임아웃 감춰두기

여기서 Timeout 객체는 setTimeout과 setInterval이 반환했다는 점을 기억하자. Timeout 객체는 Timeout의 동작을 강화하는 두 가지 함수 unref()와 ref()를 제공한다. set 함수로 스케줄링 된 Timeout 객체가 있다면 이 객체에서 unref()를 호출할 수 있습니다. 이는 동작을 다소 변경하는데 실행할 코드가 이것밖에 남지 않았다면 Timeout 객체를 호출하지 않는다.Timeout 객체는 프로세스를 유지하지 않고 실행을 기다린다.

비슷하게 unref()가 호출된 Timeout 객체에서 ref()를 호출하면 이 동작을 제거해서 실행을 보장할 수 있다. 하지만 성능 문제로 초기 동작을 완전히 똑같이 복구하는 것은 아니다.

const timerObj = setTimeout(() => {
  console.log('will i run?');
});

// 이 부분만 있다면 이 타임아웃이 프로그램을 종료되지 않게 하고 있으므로
// 위 타임아웃이 실행되지 않도록 합니다.
timerObj.unref();

// immediate 안에서 ref()를 실행해서 다시 실행상태로 만들 수 있습니다
setImmediate(() => {
  timerObj.ref();
});

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함