답변:
동기 실행은 일반적으로 순서대로 실행되는 코드를 말합니다. 비동기 실행은 코드에 나타나는 순서대로 실행되지 않는 실행을 말합니다. 다음 예에서는 동기 작업으로 인해 경고가 순서대로 시작됩니다. 비동기 작업에서는 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