programing

노드에서 setTimeout은 어떻게 작동합니까?JS?

magicmemo 2023. 8. 24. 21:57
반응형

노드에서 setTimeout은 어떻게 작동합니까?JS?

일단 실행되면 대기열에 표시되지만 대기열에서 X밀리초 후에 정확히 호출된다는 보장이 있습니까?아니면 대기열이 높은 다른 무거운 작업이 지연됩니까?

setTimeout의 의미는 웹 브라우저의 의미와 거의 같습니다. timeout arg는 실행하기 전에 기다리는 최소 ms입니다. 보증은 아닙니다.또한 0, 숫자가 아닌 숫자 또는 음수를 전달하면 최소 ms를 대기하게 됩니다.노드에서는 1ms이지만 브라우저에서는 50ms까지 가능합니다.

그 이유는 자바스크립트에 의한 자바스크립트의 프리엠프션이 없기 때문입니다.이 예를 고려해 보십시오.

setTimeout(function () {
  console.log('boo')
}, 100)
var end = Date.now() + 5000
while (Date.now() < end) ;
console.log('imma let you finish but blocking the event loop is the best bug of all TIME')

여기서의 흐름은 다음과 같습니다.

  1. 시간 초과를 100ms로 예약합니다.
  2. 5000ms 동안 바쁘게 기다립니다.
  3. 이벤트 루프로 돌아갑니다.보류 중인 타이머를 확인하고 실행합니다.

만약 이것이 사실이 아니라면, 당신은 자바스크립트의 한 부분이 다른 부분을 "방해"하도록 할 수 있습니다.이러한 코드가 추론하기 매우 어려운 것을 방지하기 위해 뮤텍스와 세마포 등을 설정해야 합니다.

var a = 100;
setTimeout(function () {
  a = 0;
}, 0);
var b = a; // 100 or 0?

노드의 JavaScript 실행의 단일 스레드는 대부분의 다른 스타일의 동시성보다 훨씬 쉽게 작업할 수 있습니다.물론 단점은 프로그램의 동작 불량 부분이 무한 루프로 전체를 차단할 수 있다는 것입니다.

이것이 선취의 복잡성보다 전투에 더 나은 악마입니까?경우에 따라 다르죠.

논블로킹의 개념은 루프 반복이 빠르다는 것입니다.따라서 각 눈금에 대해 반복하는 시간은 setTimeout이 적절한 정밀도 내에서 정확할 정도로 충분히 짧아야 합니다(아마도 100ms 미만).

이론적으로는 당신이 옳지만요.애플리케이션을 작성하고 체크 표시를 차단하면 setTimeout이 지연됩니다.질문에 답하자면, 누가 setTimeout이 제 시간에 실행되도록 보장할 수 있습니까?비차단 코드를 작성하면 거의 모든 합리적인 정확도까지 정확도를 제어할 수 있습니다.

자바스크립트가 코드 실행 측면에서 "싱글 스레드"인 한(웹워커 등 제외), 그것은 항상 일어날 것입니다.단일 스레드 특성은 대부분의 경우 매우 단순화되지만, 성공하려면 비차단 관용구가 필요합니다.

브라우저나 노드에서 이 코드를 사용해 보면 정확성에 대한 보장이 없으며 반대로 setTimeout이 매우 늦다는 것을 알 수 있습니다.

var start = Date.now();

// expecting something close to 500
setTimeout(function(){ console.log(Date.now() - start); }, 500);

// fiddle with the number of iterations depending on how quick your machine is
for(var i=0; i<5000000; ++i){}

통역사가 루프 어웨이를 최적화하지 않는 한(크롬에는 없는) 수천 개의 것을 얻을 수 있습니다.루프를 제거하면 코에 500개가 있는 것을 볼 수 있습니다.

setTimeout스레드의 일종으로, 주어진 시간 동안 작업을 유지하고 실행합니다.

setTimeout(function,time_in_mills);

여기서 첫 번째 인수는 함수 유형이어야 합니다. 예를 들어 3초 후에 이름을 인쇄하려면 코드가 아래와 같아야 합니다.

setTimeout(function(){console.log('your name')},3000);

기억해야 할 중요한 점은 사용자가 원하는 것은 무엇이든 사용한다는 것입니다.setTimeout메소드, 함수 안에서 수행합니다.일부 매개 변수를 구문 분석하여 다른 메소드를 호출하려면 코드가 다음과 같아야 합니다.

setTimeout(function(){yourOtherMethod(parameter);},3000);

코드가 실행되도록 하는 유일한 방법은 setTimeout 로직을 다른 프로세스에 배치하는 것입니다.

하위 프로세스 모듈을 사용하여 논리를 수행하고 어떤 종류의 스트림(tcp)을 통해 해당 프로세스에 데이터를 전달하는 새 node.js 프로그램을 생성합니다.

이렇게 하면 일부 긴 차단 코드가 기본 프로세스에서 실행 중인 경우에도 하위 프로세스가 이미 자체적으로 시작되어 setTimeout을 새 프로세스와 새 스레드에 배치하여 예상되는 대로 실행됩니다.

하드웨어 수준에서는 프로세스보다 더 많은 스레드가 실행되고 있으므로 컨텍스트 전환으로 인해 예상되는 타이밍에서 (매우 사소한) 지연이 발생합니다.이는 무시할 수 있는 것이어야 하며, 중요한 경우에는 무엇을 하려고 하는지, 왜 그러한 정확성이 필요한지, 대신 작업을 수행하기 위해 어떤 종류의 실시간 대체 하드웨어를 사용할 수 있는지 진지하게 고려해야 합니다.

일반적으로 하위 프로세스를 사용하고 로드 밸런서 또는 공유 데이터 스토리지(예: redis)와 함께 여러 노드 애플리케이션을 별도의 프로세스로 실행하는 것이 코드를 확장하는 데 중요합니다.

setTimeout(callback,t)최소 t밀리초 후에 콜백을 실행하는 데 사용됩니다.실제 지연은 OS 타이머 세분성 및 시스템 로드와 같은 많은 외부 요인에 따라 달라집니다.

그래서 정해진 시간 이후에 살짝 불리게 될 가능성이 있지만, 이전에는 절대 불리지 않습니다.

타이머는 24.8일을 초과할 수 없습니다.

언급URL : https://stackoverflow.com/questions/5849106/how-does-settimeout-work-in-node-js

반응형