Node.js에서 비 차단 또는 비동기 I / O 란 무엇입니까?
서버 측 자바 스크립트 엔진과 관련하여 비 차단 I / O 또는 비동기 I / O 란 무엇입니까? Java 서버 측 구현에 비해 이점으로 언급되어 있습니다.
동기 대 비동기
동기 실행은 일반적으로 순서대로 실행되는 코드를 말합니다. 비동기 실행은 코드에 나타나는 순서대로 실행되지 않는 실행을 말합니다. 다음 예에서는 동기 작업으로 인해 경고가 순서대로 시작됩니다. 비동기 작업에서는 alert(2)
두 번째로 실행 되는 것처럼 보이지만 그렇지 않습니다.
동기식 : 1,2,3
alert(1);
alert(2);
alert(3);
비동기식 : 1,3,2
alert(1);
setTimeout(() => alert(2), 0);
alert(3);
차단과 비 차단
차단은 해당 작업이 완료 될 때까지 추가 실행을 차단하는 작업을 말합니다. 비 차단은 실행을 차단하지 않는 코드를 말합니다. 주어진 예에서, localStorage
읽기 실행을 지연시키는 블로킹 작업입니다. 반면, fetch
비 차단 작업 alert(3)
은 실행 이 중단되지 않기 때문 입니다.
// Blocking: 1,... 2
alert(1);
var value = localStorage.getItem('foo');
alert(2);
// Non-blocking: 1, 3,... 2
alert(1);
fetch('example.com').then(() => alert(2));
alert(3);
장점
비 차단 비동기 작업의 한 가지 장점은 단일 CPU 및 메모리 사용을 최대화 할 수 있다는 것입니다.
동기식 차단 예
동기식 차단 작업의 예는 Java 또는 PHP와 같은 일부 웹 서버가 IO 또는 네트워크 요청을 처리하는 방법입니다. 코드가 파일이나 데이터베이스에서 읽 히면 코드는 실행 후 모든 것을 "차단"합니다. 이 기간 동안 머신은 메모리를 처리 하지 않고 스레드 를 처리하는 시간을 유지합니다 .
스레드가 정지 된 상태에서 다른 요청을 처리하려면 소프트웨어에 따라 다릅니다. 대부분의 서버 소프트웨어는 추가 요청을 처리하기 위해 더 많은 스레드를 생성합니다. 이를 위해서는 더 많은 메모리와 처리량이 필요합니다.
비동기 비 차단 예
노드에서 만든 것과 같은 비동기 비 차단 서버는 하나의 스레드 만 사용하여 모든 요청을 처리합니다. 이것은 Node의 인스턴스가 단일 스레드를 최대한 활용한다는 것을 의미합니다. 제작자는 I / O 및 네트워크 작업이 병목 현상을 전제로 설계했습니다.
요청이 서버에 도착하면 한 번에 하나씩 서비스됩니다. 그러나 서비스 된 코드가 예를 들어 DB를 쿼리해야하는 경우 콜백을 두 번째 대기열로 보내고 주 스레드는 계속 실행됩니다 (대기하지 않음). 이제 DB 작업이 완료되어 반환되면 해당 콜백이 두 번째 대기열에서 꺼내어 실행을 보류중인 세 번째 대기열에 대기합니다. 엔진이 실행 스택이 비워 질 때와 같이 다른 것을 실행할 기회를 얻으면 세 번째 대기열에서 콜백을 받아 실행합니다.
var startTime = new Date().getTime();
var getEndTime = () => {
var tempEndTime = new Date().getTime();
var second = (tempEndTime - startTime)/1000
return `took ${second} sec...to finish\n`
}
console.log('1: start App', getEndTime())
setTimeout(()=>{
console.log('2: setTimeout', getEndTime())
}, 1000)
console.log('3: End App', getEndTime())
// console -> Process Order: 1 -> 3 -> 2
참고 URL : https://stackoverflow.com/questions/10570246/what-is-non-blocking-or-asynchronous-io-in-node-js
'IT박스' 카테고리의 다른 글
Java를 사용하여 이미지 크기를 조정하는 방법 (0) | 2020.07.09 |
---|---|
iOS-보기를 통해 모든 터치 전달 (0) | 2020.07.08 |
Seaborn 플롯을 파일로 저장하는 방법 (0) | 2020.07.08 |
Firebase Cloud Messaging 용 API KEY는 어디에서 찾을 수 있습니까? (0) | 2020.07.08 |
UltiSnips와 YouCompleteMe (0) | 2020.07.08 |