IT

nextTick 대 setImmediate, 설명 설명

lottoking 2020. 9. 14. 21:23
반응형

nextTick 대 setImmediate, 설명 설명


nextTick과 setImmediate의 차이점에 대해 매우 혼란 스럽습니다. 나는 인터넷에서 그들에 대한 모든 문서를 읽었지만 여전히 작동하는지 이해하지 못합니다.

예 :

function log(n) { console.log(n); }

setImmediate

setImmediate(function() {
  setImmediate(function() {
    log(1);
    setImmediate(function() { log(2); });
    setImmediate(function() { log(3); });
  });
  setImmediate(function() {
    log(4);
    setImmediate(function() { log(5); });
    setImmediate(function() { log(6); });
  });
});

//1 2 3 4 5 6

nextTick

process.nextTick(function() {
  process.nextTick(function() {
    log(1);
    process.nextTick(function() { log(2); });
    process.nextTick(function() { log(3); });
  });
  process.nextTick(function() {
    log(4);
    process.nextTick(function() { log(5); });
    process.nextTick(function() { log(6); });
  });
});

//1 4 2 3 5 6

왜 그 결과가 발생합니까? 쉬운 설명으로 또는 이해하기 쉽게 설명하십시오. 노드 코어 개발자조차도 사람들이 nextTick과 setImmediate를 어떻게 이해해야할지 동의하지 않습니다.

출처 :


다음 두 가지 예를 고려하십시오.

setImmediate

setImmediate(function A() {
  setImmediate(function B() {
    log(1);
    setImmediate(function D() { log(2); });
    setImmediate(function E() { log(3); });
  });
  setImmediate(function C() {
    log(4);
    setImmediate(function F() { log(5); });
    setImmediate(function G() { log(6); });
  });
});

setTimeout(function timeout() {
  console.log('TIMEOUT FIRED');
}, 0)

// 'TIMEOUT FIRED' 1 4 2 3 5 6
// OR
// 1 'TIMEOUT FIRED' 4 2 3 5 6

nextTick

process.nextTick(function A() {
  process.nextTick(function B() {
    log(1);
    process.nextTick(function D() { log(2); });
    process.nextTick(function E() { log(3); });
  });
  process.nextTick(function C() {
    log(4);
    process.nextTick(function F() { log(5); });
    process.nextTick(function G() { log(6); });
  });
});

setTimeout(function timeout() {
  console.log('TIMEOUT FIRED');
}, 0)

// 1 4 2 3 5 6 'TIMEOUT FIRED'

setImmediate 시작되는 일련의 순서대로 반복 당 한 이벤트 루프에서 시작됩니다. 따라서 이벤트 루프의 첫 번째 반복에서 발생합니다. 그런 다음 이벤트 루프의 두 번째 반복에서 반복에서 B가 실행되고 이벤트 루프의 세 번째 반복에서 C가 실행됩니다. 이렇게하면 이벤트 루프가 차단되는 것을 방지하고 다른 I / O 또는 타이머가 평균 시간에 호출됩니다 (첫 번째 또는 두 번째 루프 반복에서 발생하는 0ms 시간 제한의 경우).

그러나 nextTick 보장은 현재 코드가 실행 된 다음 이벤트 루프로 돌아 가기 전에 항상 시작됩니다. nextTick 전에에서는 이벤트 루프로 돌아 가기 가기 전에 모든 nextTick이 실행됩니다. setTimeout의 출력은 이벤트 루프에서 호출되지 않을 때까지 'TIMEOUT FIRED'텍스트가 출력되지 않습니다.


이 두 함수의 Node.js 문서 이름에 따르면 정확히 바칠니다.

setImmediate () ( 권장 사항 )

이벤트에서 먼저 실행됩니다.


process.nextTick () ( USE FOR SPECIAL CASES 나중에 예제 참조 )

즉시 실행됩니다. 현재 파일의 끝에 더 많은 명령문을 작성합니다.


이 코드가 있으면

setTimeout(function(){
  console.log('Hello world 5'); // It's waiting like a normal person at a queue
}, 0);

setImmediate(function(){
  console.log('Hello world 4'); 
  // It's like get to last and be take care of first 
  // but always after of .nextTick and before of setInterval(, 0)
});

process.nextTick(function(){
   console.log('Hello world 3'); // It's like be at the bottom at this file
});

console.log('Hello world 1');
console.log('Hello world 2');

귀하의 요청에 따른 시각적 설명 :

여기에 이미지 설명 입력

처리하기 전에 방출하고 이벤트해야 할 때 process.nextTick ()을 사용하는 경우 :

const EventEmitter = require('events');
const util = require('util');

function MyEmitter() {
  EventEmitter.call(this);

  // use nextTick to emit the event once a handler is assigned
  process.nextTick(function () {
    this.emit('event');
  }.bind(this));
}
util.inherits(MyEmitter, EventEmitter);

const myEmitter = new MyEmitter();
myEmitter.on('event', function() {
  console.log('an event occurred!');
});

Philip Roberts 가 런타임 이벤트 루프에 대한 훌륭한 설명을 제공하는 이 비디오를 보고이 온라인 이벤트 루프 디버거를 보십시오. 이벤트 루프가 어떻게 작동하는지 라이브 테스트

출처 : https://github.com/nodejs/node/blob/master/doc/topics/the-event-loop-timers-and-nexttick.md#processnexttick-vs-setimmediate


에 대한 결과를 재현 할 수 없습니다 setImmediate. 그것은과 동일해야 nextTick이 상황에서 그들은 같은 일을 거의 할 수 있기 때문에 (그리고 내 테스트에서입니다). 그것에 대한 유일한 합리적인 설명은 그것이 setImmediate어떻게 든 동 기적이지만 그렇지 않다는 것입니다.

그리고 NodeJS 문서에 따르면 유일한 차이점은 여러 번 nextTick이 한 번의 루프 반복 (에 따라 다름 maxTickDepth)에서 실행되는 반면 setImmediate반복 당 한 번 실행 된다는 것 입니다.


아래는 더 나은 명확성을 제공합니다.

setImmediate

  1. 현재 폴 단계가 완료되면 스크립트를 실행합니다.
  2. 타이머 모듈 함수이고 타이머 함수는 전역 적이므로 require.
  3. clearImmediate ()로 지울 수 있습니다.
  4. I / O 이벤트 콜백 후 setTimeout () 및 setInterval () 전에 콜백의 "즉시"실행을 설정합니다.

nextTick

  1. NodeJS의 프로세스 전역 객체 기능입니다.
  2. process.nextTick ()에 전달 된 모든 콜백은 이벤트 루프가 계속되기 전에 해결됩니다.
  3. 사용자가 오류를 처리 할 수 ​​있도록합니다.
  4. 이벤트 루프가 계속되기 전에 요청을 다시 시도하는 데 도움이됩니다.

간단한 코드 스 니펫.

console.log("I'm First");

setImmediate(function () {
  console.log('Im setImmediate');
});

console.log("I'm Second");

process.nextTick(function () {
  console.log('Im nextTick');
});

console.log("I'm Last");

/*
Output
$ node server.js
I'm First
I'm Second
I'm Last
Im nextTick
Im setImmediate
*/

현재 버전의 nodejs와 지속적으로 다른 답변을 얻었고 추론하기 쉽기 때문에 위의 모든 답변은 쓸모가 없다고 생각합니다.

var log=console.log
log(process.version)

var makeAsyncCall
if(false)
    makeAsyncCall=setImmediate
else
    makeAsyncCall=process.nextTick;

makeAsyncCall(function A () {
    makeAsyncCall(function B() {
        log(1);
        makeAsyncCall(function C() { log(2); });
        makeAsyncCall(function D() { log(3); });
    });
    makeAsyncCall(function E() {
        log(4);
        makeAsyncCall(function F() { log(5); });
        makeAsyncCall(function G() { log(6); });
    });
});
//1
//4
//2
//3
//5
//6
//in both case

읽은 후 https://github.com/nodejs/node/blob/master/doc/topics/the-event-loop-timers-and-nexttick.md#processnexttick-vs-setimmediate을 에서 사용하기 시작하자 setImmediate우리는 추적한다 는 check queue이 곳이기 때문에 setImmediate콜백 상주합니다.

첫 번째 반복

A 밀어 붙이다 check queue

큐 확인 : [A]

두 번째 반복

A풀로부터 밖으로 queue실행하려면

그 실행하는 동안, 그것은 넣어 BEqueue다음과 A완성을하고 다음 반복을 시작합니다

큐 확인 : [B, E]

세 번째 반복

당기고 B밀다C D

큐 확인 : [E, C, D]

네 번째 반복

당기고 E밀다F G

큐 확인 : [C, D, F, G]

드디어

대기열의 콜백을 순차적으로 실행

예를 들어 nextTick, 큐는 똑같은 방식으로 작동하므로 동일한 결과를 생성합니다.

다른 점은 다음과 같습니다.

nextTickQueue는 이벤트 루프의 현재 단계에 관계없이 현재 작업이 완료된 후에 처리됩니다.

명확하게 말하면 이벤트 루프는 여러 큐를 유지하고 check queue그중 하나 일 뿐이며 노드는 일부 규칙에 따라 사용할 큐를 결정합니다.

함께 process.nextTick하지만, 그것은 일종의 모든 규칙을 우회이며에 콜백을 실행 nextTick즉시

참고 URL : https://stackoverflow.com/questions/17502948/nexttick-vs-setimmediate-visual-explanation

반응형