[javascript] node.js에서 동기 프로그래밍과 비동기 프로그래밍의 차이점은 무엇입니까?
나는 nodebeginner를 읽고 있었고
다음 두 가지 코드를 보았습니다 .
첫번째:
var result = database.query("SELECT * FROM hugetable");
console.log("Hello World");
두 번째 것 :
database.query("SELECT * FROM hugetable", function(rows) {
var result = rows;
});
console.log("Hello World");
나는 그들이해야 할 일을 얻었고, 그들은 데이터베이스에 쿼리하여 쿼리에 대한 답변을 검색합니다. 그리고 나서 console.log('Hello world')
.
첫 번째는 동기 코드 일 것입니다. 두 번째는 비동기 코드입니다.
두 조각의 차이점은 매우 모호합니다. 결과물은 무엇입니까?
비동기 프로그래밍에 대한 인터넷 검색도 도움이되지 않았습니다.
답변
차이점은 첫 번째 예제 에서 프로그램이 첫 번째 라인에서 차단된다는 것입니다. 다음 줄 ( console.log
)을 기다려야합니다.
에서 두 번째 예 는이 console.log
질의가 처리되는 동안 실행된다. 즉, 쿼리는 백그라운드에서 처리되고 프로그램은 다른 작업을 수행하고 쿼리 데이터가 준비되면 원하는 작업을 수행합니다.
요컨대, 첫 번째 예는 차단되지만 두 번째 예는 차단되지 않습니다.
다음 두 가지 예의 출력 :
// Example 1 - Synchronous (blocks)
var result = database.query("SELECT * FROM hugetable");
console.log("Query finished");
console.log("Next line");
// Example 2 - Asynchronous (doesn't block)
database.query("SELECT * FROM hugetable", function(result) {
console.log("Query finished");
});
console.log("Next line");
될 것입니다 :
Query finished
Next line
Next line
Query finished
노트
노드 자체는 단일 스레드 이지만 병렬로 실행할 수있는 작업이 있습니다. 예를 들어 파일 시스템 작업은 다른 프로세스에서 발생합니다.
그렇기 때문에 Node가 비동기 작업을 수행 할 수 있습니다. 하나의 스레드는 파일 시스템 작업을 수행하고 기본 Node 스레드는 계속 자바 스크립트 코드를 실행합니다. Node와 같은 이벤트 중심 서버에서 파일 시스템 스레드는 완료, 실패 또는 진행과 같은 특정 이벤트 (예 : 데이터베이스 쿼리 결과 또는 오류와 같은 데이터)를 주 노드 스레드에 알립니다. 메시지)와 기본 노드 스레드가 해당 데이터로 수행 할 작업을 결정합니다.
여기에서 더 많은 것을 읽을 수 있습니다 : 단일 스레드 비 차단 IO 모델이 Node.js에서 작동하는 방법
답변
이 두 가지 방법의 차이점은 다음과 같습니다.
동기 방식 :
각 작업이 완료 될 때까지 기다린 후 다음 작업 만 실행합니다. 쿼리의 경우 : console.log()
데이터베이스에서 모든 결과를 얻기 위해 쿼리 실행이 완료되지 않는 한 &가 될 때까지 명령이 실행되지 않습니다.
비동기 방식 :
각 작업이 완료 될 때까지 기다리지 않고 첫 번째 GO에서만 모든 작업을 실행합니다. 결과가 나오면 각 작업의 결과가 처리됩니다. 쿼리의 경우 : 메소드 console.log()
실행 후 명령이 곧 실행됩니다 Database.Query()
. 데이터베이스 쿼리는 백그라운드에서 실행되고 데이터 검색이 완료되면 결과를로드합니다.
사용 사례
-
DB에서 대량의 데이터를 쿼리하는 것과 같이 작업이 너무 많이 들리지 않으면 동기 방식으로 진행하고 그렇지 않으면 비동기 방식으로 진행하십시오.
-
비동기 방식으로 사용자에게 일부 진행 표시기를 표시 할 수 있으며 백그라운드에서 무거운 작업을 계속할 수 있습니다. 이것은 GUI 앱에 이상적인 시나리오입니다.
답변
두 예제 모두에 줄을 추가하면 조금 더 명확 해집니다.
var result = database.query("SELECT * FROM hugetable");
console.log(result.length);
console.log("Hello World");
두 번째 것 :
database.query("SELECT * FROM hugetable", function(rows) {
var result = rows;
console.log(result.length);
});
console.log("Hello World");
이것을 실행하면 첫 번째 (동기식) 예제 인 result.length가 ‘Hello World’행 전에 인쇄됩니다. 두 번째 (비동기식) 예제에서는 “Hello World”행 뒤에 result.length가 인쇄 될 가능성이 높습니다.
두 번째 예에서는 database.query
백그라운드에서 비동기식으로 실행되고 스크립트는 “Hello World”와 함께 계속 진행 되기 때문입니다 . 는 console.log(result.length)
데이터베이스 쿼리가 완료된 경우에만 실행됩니다.
답변
먼저, 나는이 질문에 대답하는데 늦었다는 것을 알고 있습니다.
동기식 및 비동기식에 대해 논의하기 전에 프로그램 실행 방법을 간단히 살펴 보겠습니다.
에서 동기 의 경우, 각 문 완료 다음 명령문이 실행되기 전에. 이 경우 프로그램은 명령문 순서대로 정확하게 평가됩니다.
이것은 비동기식입니다 JavaScript에서 방식입니다. JavaScript 엔진에는 코드를 확인하고 작업을 대기열에 넣는 부분과 대기열을 처리하는 부분이 있습니다. 큐 처리는 하나의 스레드에서 발생하므로 한 번에 하나의 작업 만 발생할 수 있습니다.
두 번째 데이터베이스 쿼리와 같은 비동기 작업이 표시되면 코드가 구문 분석되고 작업이 대기열에 배치되지만이 경우이 작업이 완료되면 콜백이 실행되도록 등록됩니다. 대기열에 이미 많은 작업이있을 수 있습니다. 큐 앞의 조작이 처리되고 큐에서 제거됩니다. 데이터베이스 쿼리 작업이 처리되면 요청이 데이터베이스로 전송되고 완료되면 콜백이 완료시 실행됩니다. 이때 작업을 “처리 한”큐 프로세서는 다음 작업에서 이동합니다.이 경우
console.log("Hello World");
데이터베이스 쿼리가 여전히 처리되고 있지만 console.log 작업이 큐의 앞에 있으며 처리됩니다. 이것은 동기 작업이므로 즉시 “Hello World”출력이 생성됩니다. 얼마 후, 데이터베이스 작업이 완료된 후에 만 쿼리에 등록 된 콜백이 호출되고 처리되어 변수 결과 값이 행으로 설정됩니다.
하나의 비동기 작업으로 인해 다른 비동기 작업이 발생할 수 있습니다.이 두 번째 작업은 큐에 배치되고 큐의 맨 앞에 오면 처리됩니다. 비동기 작업으로 등록 된 콜백을 호출하면 JavaScript 런타임이 작업 수행시 작업 결과를 반환하는 방식입니다.
어떤 JavaScript 작업이 비동기인지 알 수있는 간단한 방법은 콜백이 필요한지 확인하는 것입니다. 콜백은 첫 번째 작업이 완료 될 때 실행될 코드입니다. 문제의 두 가지 예에서 두 번째 경우에만 콜백이 있음을 알 수 있으므로 두 경우의 비동기 작업입니다. 비동기 작업의 결과를 처리하는 스타일이 다르기 때문에 항상 그런 것은 아닙니다.
자세한 내용은 약속에 대해 읽으십시오. 약속은 비동기 작업의 결과를 처리 할 수있는 또 다른 방법입니다. 약속에 대한 좋은 점은 코딩 스타일이 동기 코드와 비슷하다는 느낌입니다.
노드 ‘fs’와 같은 많은 라이브러리는 일부 작업에 동기식 스타일과 비동기식 스타일을 모두 제공합니다. 구성 파일을 읽는 경우와 같이 작업 시간이 오래 걸리고 많이 사용되지 않는 경우 동기 스타일 작업을 수행하면 코드를보다 쉽게 읽을 수 있습니다.
답변
동 기적 경우 SQL 쿼리 실행이 완료 될 때까지 console.log 명령이 실행되지 않습니다.
비동기적인 경우 console.log 명령이 직접 실행됩니다. 쿼리 결과는 나중에 “콜백”기능에 의해 저장됩니다.
답변
주요 차이점은 비동기 프로그래밍과 달리 실행을 중지하지 않습니다. ‘요청’이 진행되는 동안 다른 코드를 계속 실행할 수 있습니다.
답변
이 함수는 두 번째 것을 비동기로 만듭니다.
첫 번째는 프로그램이 다음 행을 계속하기 전에 각 행의 실행이 끝날 때까지 프로그램이 강제로 실행하도록합니다. 두 번째 줄은 각 줄을 한 번에 함께 (그리고 독립적으로) 실행할 수 있습니다.
비동기식 또는 동시성을 허용하는 언어 및 프레임 워크 (js, node.js)는 실시간 전송 (예 : 채팅, 스톡 애플리케이션)이 필요한 작업에 적합합니다.