노드에서 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')
여기서의 흐름은 다음과 같습니다.
- 시간 초과를 100ms로 예약합니다.
- 5000ms 동안 바쁘게 기다립니다.
- 이벤트 루프로 돌아갑니다.보류 중인 타이머를 확인하고 실행합니다.
만약 이것이 사실이 아니라면, 당신은 자바스크립트의 한 부분이 다른 부분을 "방해"하도록 할 수 있습니다.이러한 코드가 추론하기 매우 어려운 것을 방지하기 위해 뮤텍스와 세마포 등을 설정해야 합니다.
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
'programing' 카테고리의 다른 글
IE에서 .change()를 인식하도록 jQuery를 가져오는 중 (0) | 2023.08.24 |
---|---|
CSS를 사용하여 사용자 지정 글꼴을 사용하시겠습니까? (0) | 2023.08.24 |
Android 명령줄 도구 sdkmanager에 항상 표시됨: 경고: 설정을 만들 수 없음 (0) | 2023.08.24 |
MySQL PHP - SELECT WHERE ID = array()? (0) | 2023.08.24 |
CSS 파일에 @charset "UTF-8"을 지정하는 이유는 무엇입니까? (0) | 2023.08.24 |