>  기사  >  웹 프론트엔드  >  JavaScript의 이벤트 루프 분석

JavaScript의 이벤트 루프 분석

不言
不言앞으로
2019-03-26 09:36:291591검색

이 기사의 내용은 JavaScript의 이벤트 루프 분석에 대한 것입니다. 필요한 친구들이 참고할 수 있기를 바랍니다.

이벤트 루프란 무엇인가요?

공식 웹사이트 설명

JavaScript의 이벤트 루프 분석

개인적으로 이해하기로는 js의 단일 스레드는 작업 스택이 단일 스레드라는 것을 의미하지만 비동기 I/O를 처리하는 방법은 libuv를 사용하여 스레드 풀을 여는 것입니다. 처리가 완료되면 작업이 폴 큐에 추가되고 작업 스택의 작업이 비어 있거나 이벤트가 임계값에 도달하면 폴 큐 및 타이머 작업을 작업 스택에 추가하고 주기를 계속합니다. js의 이벤트 루프.

Structure

   ┌───────────────────────────┐
┌─>│           timers          │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │     pending callbacks     │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │       idle, prepare       │
│  └─────────────┬─────────────┘      ┌───────────────┐
│  ┌─────────────┴─────────────┐      │   incoming:   │
│  │           poll            │<p><strong>timer: </strong><br> 예약된 작업은 임계값에 도달하면 즉시 실행되지 않지만 작업 스택을 기다리는 작업에 의해 차단됩니다. </p><p><strong>보류 중인 콜백: </strong><br> 이 단계에서는 특정 시스템 작업(예: TCP 오류 유형)에 대한 콜백을 수행합니다. 예를 들어, 일부 *nix 시스템은 연결을 시도하는 동안 TCP 소켓이 수신되면 오류 보고를 기다리기를 원합니다. 이는 보류 중인 콜백 단계에서 실행을 위해 대기열에 추가됩니다. </p><p><strong>pull:</strong> <br>이 단계에는 두 가지 주요 기능이 있습니다. <br> I/O를 차단하고 폴링해야 하는 시간을 계산한 다음 <br> 폴 대기열의 이벤트를 처리합니다. <br>이벤트 루프가 폴링 단계에 들어가고 예약된 타이머가 없으면 두 가지 중 하나가 발생합니다. </p><p>폴링 대기열이 비어 있지 않으면 이벤트 루프는 대기열이 소진될 때까지 동기식으로 실행하는 콜백 대기열을 순회합니다. 또는 시스템 관련 하드 제한에 도달했습니다. </p><p>폴링 대기열이 비어 있으면 다음 두 가지 중 하나가 발생합니다. </p><p>스크립트가 setImmediate를 실행한 경우 이벤트 루프는 폴링 단계를 종료하고 확인 단계를 계속하여 이러한 예약 스크립트를 실행합니다. </p><p>스크립트가 setImmediate를 실행하지 않으면 이벤트 루프는 콜백이 폴 큐에 추가될 때까지 기다린 다음 즉시 실행합니다. </p><p>폴링 대기열이 비면 이벤트 루프는 타이머를 확인하고 하나 이상의 타이머가 준비되면 이벤트 루프는 타이머 단계를 순환하여 해당 타이머 콜백을 실행합니다. </p><p><strong>check</strong> <br>이 단계에서는 폴링 단계가 완료된 후 즉시 콜백을 실행할 수 있습니다. 폴링 단계가 유휴 상태가 되고 setImmediate 작업이 있는 경우 이벤트 루프는 콜백이 추가될 때까지 기다리는 폴 단계에서 차단하는 대신 실행을 확인하기 위해 직접 점프합니다. </p><p>setImmediate는 실제로 이벤트 루프의 별도 단계에서 실행되는 특수 타이머입니다. libuv API를 사용하여 폴링 단계가 완료된 후 실행될 콜백을 예약합니다. </p><p><strong>close callbacks</strong></p><p>소켓이나 핸들이 갑자기 닫히면(socket.destroy() 등) 이 단계에서 'close' 이벤트가 발생합니다. 그렇지 않으면 process.nextTick()에 의해 방출됩니다. </p><p>이 기사는 여기까지입니다. 더 많은 흥미로운 콘텐츠를 보려면 PHP 중국어 웹사이트의 <a href="http://www.php.cn/course/list/17.html" target="_blank">JavaScript Video Tutorial</a> 칼럼을 주목하세요! </p><p><br></p><p> </p>

위 내용은 JavaScript의 이벤트 루프 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제