Node.js에서 비차단 또는 비동기 I/O란 무엇입니까?
서버 사이드 자바스크립트 엔진의 맥락에서 비차단 I/O 또는 비동기 I/O는 무엇입니까?Java 서버 측 구현에 비해 이점으로 언급되고 있습니다.
동기식 vs 비동기식
동기식 실행은 일반적으로 코드가 순서대로 실행되는 것을 말합니다.비동기 실행은 코드에 나타나는 순서대로 실행되지 않는 실행을 말합니다.다음 예제에서는 동기식 작업으로 인해 알림이 순차적으로 실행됩니다.비동기 작업에서는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 또는 네트워크 요청을 처리하는 방법이 있습니다.코드가 파일 또는 데이터베이스에서 읽을 경우 코드는 실행 후 모든 것을 "차단"합니다.그 기간 동안, 당신의 기계는 아무것도 하지 않는 스레드를 위해 메모리와 처리 시간을 보유하고 있습니다.
스레드가 정지된 상태에서 다른 요청을 처리하려면 소프트웨어에 따라 다릅니다.대부분의 서버 소프트웨어는 추가 요청을 충족하기 위해 더 많은 스레드를 생성합니다.이를 위해서는 더 많은 메모리가 사용되고 더 많은 처리가 필요합니다.
비동기식 비차단 예제
노드에서 만들어진 것과 같은 비동기 비차단 서버는 하나의 스레드만 사용하여 모든 요청을 처리합니다.이는 노드 인스턴스가 단일 스레드를 최대한 활용한다는 것을 의미합니다.제작자들은 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-i-o-in-node-js
'programing' 카테고리의 다른 글
| 역할 ASP에 사용자 추가.NET 아이덴티티 (0) | 2023.08.06 |
|---|---|
| CSS 그리드 래핑 (0) | 2023.08.06 |
| 포스트백이란 무엇입니까? (0) | 2023.08.06 |
| 어떻게 CSS가 (자바스크립트가 아닌) 문자열로 시작하는 ID를 선택하도록 합니까? (0) | 2023.08.06 |
| Powershell의 람다 식 (0) | 2023.08.06 |
