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


136

서버 측 자바 스크립트 엔진과 관련하여 비 차단 I / O 또는 비동기 I / O 란 무엇입니까? Java 서버 측 구현에 비해 이점으로 언급되어 있습니다.


3
이 개념을 이해하려면 브라우저 환경에서 스크립트 태그를 생각하면 도움이됩니다. Zakas는 이것에 대한 훌륭한 기사를 가지고 있습니다-처음 몇 섹션은 차단의 개념을 설명하기에 충분해야합니다 : nczonline.net/blog/2010/08/10/what-is-a-non-blocking-script
netpoetica

답변:


317

동기 대 비동기

동기 실행은 일반적으로 순서대로 실행되는 코드를 말합니다. 비동기 실행은 코드에 나타나는 순서대로 실행되지 않는 실행을 말합니다. 다음 예에서는 동기 작업으로 인해 경고가 순서대로 시작됩니다. 비동기 작업에서는 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 작업이 완료되어 반환되면 해당 콜백이 두 번째 대기열에서 꺼내어 실행을 보류중인 세 번째 대기열에 대기합니다. 엔진이 실행 스택이 비워 질 때와 같이 다른 것을 실행할 기회를 얻으면 세 번째 대기열에서 콜백을 가져 와서 실행합니다.


5
PHP 차단에서 두 번째 단락을 이해하지 못했습니다 . "PHP는 일반적으로 IO를 차단하지만 OS가 자동으로 IO 작업을 스레딩하기 때문에 그렇지 않습니다." 또는 PHP가 각 요청에 대해 자동으로 새 스레드를 생성하여 하나의 차단 된 요청이 전체 PHP 환경을 중단시키지 않기 때문에 이것이 PHP에서 문제가 아니라고 말하는가? (나는 후자를 추측하고있다 ..)
dcow

6
후자입니다.
Joseph

2
후자를 의미한다면 잠그지 않는 I / O PHP (reactivePHP 또는 다른 것과 같은)가 차단하는 것보다 장점이 무엇입니까? 아직도 혼동
Sunu Pinasthika Fajar

5
@CharlieParker 예. 비동기 작업은 코드와 병렬로 실행됩니다. 그러나 비동기 작업의 결과로 "복귀"하는 콜백은 기본 코드가 사용 중이 아닌 경우 기본 코드에서 실행을 위해 대기합니다.
Joseph

2
@CharlieParker 다음 은 비동기 메커니즘의 내부에 대해 자세히 다루는 게시물 입니다.
Joseph

7
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

코드 예

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.