IT박스

Node.js에서 비 차단 또는 비동기 I / O 란 무엇입니까?

itboxs 2020. 7. 8. 08:08
반응형

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

반응형