sourcecode

동기 프로그래밍과 비동기 프로그래밍(node.js)의 차이점은 무엇입니까?

copyscript 2022. 12. 26. 20:32
반응형

동기 프로그래밍과 비동기 프로그래밍(node.js)의 차이점은 무엇입니까?

노드 비기너를 읽다가 다음 두 개의 코드를 발견했어요

첫 번째:

    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");

다음과 같습니다.

  1. Query finished
    Next line
  2. Next line
    Query finished

★★★
노드 자체는 단일 스레드이지만 병렬로 실행할 수 있는 태스크가 있습니다.예를 들어 파일 시스템 작업은 다른 프로세스에서 수행됩니다.

이것이 노드가 비동기 조작을 할 수 있는 이유입니다.메인 노드 스레드가 javascript 코드를 계속 실행하는 동안, 1개의 스레드는 파일 시스템 조작을 합니다.Node와 같은 이벤트 드리븐 서버에서는 파일시스템 스레드가 메인 노드스레드에 완료, 실패, 진행 등의 특정 이벤트를 해당 이벤트와 관련된 데이터(데이터베이스 쿼리의 결과 또는 오류 메시지 등)와 함께 통지하고 메인 노드스레드가 해당 데이터를 어떻게 처리할지를 결정합니다.

상세한 것에 대하여는, 여기를 참조해 주세요.Node.js에서의 싱글 스레드 논블로킹 IO 모델 동작

이 두 가지 접근법의 차이는 다음과 같습니다.

동기 방식:각 조작이 완료될 때까지 기다린 후 다음 조작만 실행됩니다.문의 내용:console.log()데이터베이스로부터 모든 결과를 가져오기 위해 쿼리 실행이 완료될 때까지 명령어는 실행되지 않습니다.

비동기 방식:각 조작이 완료될 때까지 기다리지 않고 첫 번째 GO에서만 모든 조작을 수행합니다.각 작업의 결과는 결과가 나오면 처리됩니다.문의 내용:console.log()는 곧 됩니다.Database.Query()합니다.데이터베이스 쿼리는 백그라운드에서 실행되며 데이터 검색이 완료되면 결과를 로드합니다.

사용 사례

  1. DB에서 대용량 데이터를 쿼리하는 것과 같이 작업이 많이 수행되지 않는 경우 동기 방식으로 진행하십시오. 그렇지 않으면 비동기 방식으로 진행하십시오.

  2. 비동기 방식으로 백그라운드에서 헤비 웨이트 작업을 계속할 수 있는 진행률 표시기를 사용자에게 표시할 수 있습니다.이는 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' 행 앞에 출력된다는 것을 알 수 있습니다.두 번째(비동기) 예에서는 result.length가 "Hello World" 행 뒤에 인쇄됩니다.

두 번째 database.query는 백그라운드에서 비동기적으로 실행되며 스크립트는 즉시 "Hello World"로 계속됩니다.console.log(result.length)는 데이터베이스 조회가 완료된 경우에만 실행됩니다.

우선, 이 질문에 답하는 것이 늦었다는 것을 깨달았습니다.

동기식 및 비동기식에 대해 설명하기 전에 프로그램 작동 방식을 간략히 살펴보겠습니다.

동기화된 경우 각 은 다음 문이 실행되기 전에 완료됩니다.이 경우 프로그램은 문장의 순서대로 정확하게 평가됩니다.

이것이 JavaScript에서의 비동기 동작 방식입니다.JavaScript 엔진에는 코드를 확인하고 작업을 큐잉하는 부분과 큐를 처리하는 부분이 있습니다.큐 처리는 1개의 스레드로 이루어지기 때문에 한번에 실행할 수 있는 조작은 1개뿐입니다.

(두 번째 데이터베이스 쿼리와 마찬가지로) 비동기 조작이 검출되면 코드가 해석되고 동작이 큐에 들어가지만 이 경우 콜백은 이 조작이 완료되었을 때 실행되도록 등록됩니다.큐에 이미 많은 작업이 포함되어 있을 수 있습니다.큐 전면의 조작이 처리되어 큐에서 삭제됩니다.데이터베이스 쿼리 조작이 처리되면 요구가 데이터베이스로 전송되고 완료 시 콜백이 실행됩니다.이 때, 조작을 「처리」한 큐 프로세서는, 다음의 조작으로 이동합니다(이 경우는).

    console.log("Hello World"); 

데이터베이스 쿼리는 아직 처리 중이지만 console.log 작업은 큐의 맨 앞에 있으며 처리됩니다.이는 동기 조작이 즉시 실행되어 "Hello World" 출력이 즉시 생성됩니다.잠시 후 데이터베이스 조작이 완료되고 쿼리에 등록된 콜백이 호출되어 처리되며 변수 결과 값이 행으로 설정됩니다.

하나의 비동기 조작으로 인해 다른 비동기 조작이 발생할 수 있습니다.이 두 번째 조작은 큐에 배치되어 큐의 선두에 도달하면 처리됩니다.비동기 조작에 등록된 콜백을 호출하는 것은 JavaScript 실행 시간이 완료되면 조작 결과를 반환하는 방법입니다.

어떤 JavaScript 조작이 비동기인지 알기 위한 간단한 방법은 콜백이 필요한지 확인하는 것입니다.콜백은 첫 번째 조작이 완료되면 실행되는 코드입니다.질문의 두 가지 예에서는 두 번째 케이스만 콜백을 가지고 있음을 알 수 있습니다.따라서 두 케이스의 비동기 조작입니다.비동기 조작의 결과를 처리하는 스타일이 다르기 때문에 항상 그렇지는 않습니다.

자세한 내용은 약속에 대해 읽어보십시오.약속은 비동기 연산의 결과를 처리할 수 있는 또 다른 방법입니다.약속의 좋은 점은 코딩 스타일이 동기 코드처럼 느껴진다는 것이다.

노드 'fs'와 같은 많은 라이브러리는 일부 작업에 대해 동기식 및 비동기식 스타일을 제공합니다.컨피규레이션파일 읽기처럼 작업이 오래 걸리지 않고 많이 사용되지 않는 경우에는 동기식 작업을 통해 읽기 쉬운 코드가 생성됩니다.

동기화된 경우 console.log 명령어는 SQL 쿼리의 실행이 완료될 때까지 실행되지 않습니다.

비동기일 경우 console.log 명령어가 직접 실행됩니다.쿼리 결과는 나중에 "콜백" 함수에 의해 저장됩니다.

주요 차이점은 비동기 프로그래밍입니다. 그렇지 않으면 실행을 중지하지 않습니다.'요청'이 이루어지는 동안 다른 코드를 계속 실행할 수 있습니다.

JS의 비동기 프로그래밍:

동기

  • 이 작업이 완료될 때까지 추가 코드 실행을 중지합니다.
  • 이 추가 실행이 중지되기 때문에 동기 코드를 '차단'이라고 합니다.다른 코드가 실행되지 않는다는 의미의 차단입니다.

비동기

  • 이 실행은 이벤트 루프에 지연됩니다. 이는 동기 함수 스택이 비어 있는 후 비동기 함수를 실행하는 JS 가상 시스템의 구성입니다.
  • 비동기 코드는 이후 코드 실행을 차단하지 않으므로 비차단이라고 합니다.

예:

// This function is synchronous
function log(arg) {
    console.log(arg)
}

log(1);

// This function is asynchronous
setTimeout(() => {
    console.log(2)
}, 0);

log(3)

  • 이 예에서는 로그 1, 3, 2가 기록됩니다.
  • 스택이 비운 후 실행되는 비동기 함수 내에 있기 때문에 2가 마지막으로 기록됩니다.

이 함수는 두 번째 함수를 비동기화합니다.

첫 번째 행은 다음 행이 계속 진행되기 전에 각 행이 완료될 때까지 프로그램을 강제로 대기시킵니다.두 번째는 각 회선을 동시에(및 독립적으로) 실행할 수 있도록 합니다.

비동기 또는 동시성을 허용하는 언어 및 프레임워크(js, node.js)는 실시간 전송이 필요한 것(채팅, 주식 애플리케이션 등)에 적합합니다.

동기 함수는 차단되지만 비동기 함수는 차단되지 않습니다.동기 함수에서는 다음 문이 실행되기 전에 문이 완료됩니다.이 경우, 프로그램은 문장의 순서로 정확하게 평가되며, 문장의 하나가 매우 오래 걸리면 프로그램 실행이 일시 중지됩니다.

비동기 함수는 보통 콜백을 파라미터로 받아들이고 비동기 함수가 호출된 직후 다음 행에서 실행을 계속합니다.콜백은 비동기 조작이 완료되어 콜스택이 비어 있을 때만 호출됩니다.웹 서버에서 데이터를 로드하거나 데이터베이스를 쿼리하는 등의 헤비듀티 조작은 메인 스레드가 그 긴 조작을 완료할 때까지 차단하지 않고 다른 조작을 계속 실행할 수 있도록 비동기적으로 수행해야 합니다(브라우저의 경우 UI가 정지됩니다).

Github에 게시된 Orginal: 링크

동기 프로그래밍

C, C#, Java와 같은 프로그래밍 언어는 동기 프로그래밍입니다. 당신이 쓰는 것은 당신이 쓰는 순서대로 실행됩니다.

-GET DATA FROM SQL.
//Suppose fetching data take 500 msec

-PERFORM SOME OTHER FUNCTION.
//Performing some function other will take 100 msec, but execution of other 
//task start only when fetching of sql data done (i.e some other function 
//can execute only after first in process job finishes).

-TOTAL TIME OF EXECUTION IS ALWAYS GREATER THAN (500 + 100 + processing time) 
msec

비동기

NodeJs는 비동기 기능을 제공합니다.이것은 본질적으로 비블로킹입니다.예를 들어, 가져오기, 쓰기, 읽기 등 시간이 걸리는 I/O 태스크에서는 nodej가 아이돌 상태로 유지되지 않고 태스크가 완료될 때까지 대기하고 큐에서 다음 태스크가 실행되기 시작하여 태스크가 완료될 때마다 콜백을 사용하여 알립니다.다음 예시는 도움이 됩니다.

//Nodejs uses callback pattern to describe functions.
//Please read callback pattern to understand this example

//Suppose following function (I/O involved) took 500 msec
function timeConsumingFunction(params, callback){
  //GET DATA FROM SQL
  getDataFromSql(params, function(error, results){
    if(error){
      callback(error);
    }
    else{
      callback(null, results);
    }
  })
}

//Suppose following function is non-blocking and took 100 msec
function someOtherTask(){
  //some other task
  console.log('Some Task 1');
  console.log('Some Task 2');
}

console.log('Execution Start');

//Start With this function
timeConsumingFunction(params, function(error, results){
    if(error){
      console.log('Error')
    }
    else{
      console.log('Successfull'); 
    }
  })

//As (suppose) timeConsumingFunction took 500 msec, 
//As NodeJs is non-blocking, rather than remain idle for 500 msec, it will start 
//execute following function immediately
someOtherTask();

즉, 출력은 다음과 같습니다.

Execution Start
//Roughly after 105 msec (5 msec it'll take in processing)
Some Task 1
Some Task 2
//Roughly After 510 msec
Error/Successful //depends on success and failure of DB function execution

동기화가 확실히 600밀리초(500+100+처리시간) 이상 걸리는 경우, 비동기화에 의해서 시간이 절약됩니다.

언급URL : https://stackoverflow.com/questions/16336367/what-is-the-difference-between-synchronous-and-asynchronous-programming-in-node

반응형