복붙노트

[NODEJS] 동기 및 비동기 프로그래밍의 차이 (Node.js를 단위) 란

NODEJS

동기 및 비동기 프로그래밍의 차이 (Node.js를 단위) 란

해결법


  1. 1.차이점은 첫 번째 예에서, 프로그램은 제 라인 차단한다는 것이다. 다음 라인 (CONSOLE.LOG)는 기다려야 할 것이다.

    차이점은 첫 번째 예에서, 프로그램은 제 라인 차단한다는 것이다. 다음 라인 (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");
    

    될 것이다 :

    노트 노드 자체는 단일 스레드이지만, 병렬로 실행할 수있는 작업이 있습니다. 예를 들어, 파일 시스템 작업은 다른 프로세스에서 발생한다.

    노드가 작업을 비동기 할 수있는 이유 : 하나 개의 스레드는 파일 시스템 작업을하고, 주요 노드 스레드가 자바 스크립트 코드를 실행 유지하면서. 노드, 파일 시스템 스레드 통지 등의 완료, 실패 또는 진행 등 특정 이벤트의 메인 노드 스레드, 같은 이벤트 기반 서버에서 같은 데이터베이스 쿼리 또는 오류의 결과로 해당 이벤트 (와 관련된 모든 데이터와 함께 메시지) 메인 노드 스레드는 데이터 수행 할 작업을 결정합니다.

    당신은 여기에 더 이것에 대해 읽을 수 있습니다 : IO 모델을 차단 단일 스레드 비는 Node.js를 작동하는 방법


  2. 2.다음과 같이이 두 가지 접근 방식의 차이는 :

    다음과 같이이 두 가지 접근 방식의 차이는 :

    동기 방식 : 이 단지는 다음 작업을 실행 한 후에는 완료로 각 작업을 기다립니다. 당신의 쿼리 : 을 console.log () 명령까지 및 실행되지 않습니다 쿼리가 데이터베이스에서 모든 결과를 얻을 실행을 완료하지 않는 한.

    비동기 방식 : 그것은 결코 완전한 각 작업에 대기없고, 오히려 첫 번째 GO에서 모든 작업을 실행합니다. 결과가 사용할 수있게되면 각 작업의 결과는 처리됩니다. 당신의 쿼리 : 을 console.log () 명령은 곧 Database.Query () 메소드 후 실행됩니다. 배경과로드 결과의 데이터베이스 쿼리 실행은이 데이터를 검색이 완료되면 있지만.

    사용 사례


  3. 3.당신이 두 예에 한 줄을 추가하는 경우이 조금 더 명확 될 것입니다 :

    당신이 두 예에 한 줄을 추가하는 경우이 조금 더 명확 될 것입니다 :

    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가 '안녕하세요'라인 전에 인쇄됩니다 알 수 있습니다. 두 번째 (비동기) 예에서 result.length는 (대부분)은 "안녕하세요"라인 후에 인쇄됩니다.

    두 번째 예에서 database.query 백그라운드에서 비동기 적으로 실행하기 때문이다, 그리고 스크립트는 "안녕하세요"와 직선 계속됩니다. 데이터베이스 쿼리가 완료되면 CONSOLE.LOG은 (result.length)에만 실행됩니다.


  4. 4.첫째, 나는이 질문에 대답 늦은 오전 알고 있습니다.

    첫째, 나는이 질문에 대답 늦은 오전 알고 있습니다.

    동기 및 비동기 논의하기 전에, 우리에게 프로그램 실행 방법에 대해 간단히 살펴 보자.

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

    이 자바 스크립트에서 어떻게 비동기 작품이다. 자바 스크립트 엔진의 두 부분, 한 부분이있다 코드와 대기열에 작업에서 외모와 큐를 처리하는 또 다른. 큐 처리는 하나의 작업을 한 번에 일어날 수있는 이유는 하나 개의 스레드에서 발생합니다.

    비동기 동작 (제 데이터베이스 조회 등)를 볼 때, 코드가 해석되고, 동작이 큐에 배치되어 있지만,이 경우에는 콜백 때 동작 완료를 실행하도록 등록된다. 큐는 이미 많은 작업을 할 수 있습니다. 대기열의 앞쪽에 작업 처리 큐로부터 제거된다. 데이터베이스 쿼리에 대한 작업이 처리되면, 요청이 데이터베이스로 전송하고 완료되면 콜백 완료에 실행됩니다. 이 경우 - 이때 갖는 큐 프로세서가 다음 동작의 조작 이동 "처리"

        console.log("Hello World"); 
    

    데이터베이스 쿼리 아직 처리되고 있지만 CONSOLE.LOG 작업 대기열의 앞쪽에 있고, 처리 얻는다. 이되는 동기 작업은 출력에 "Hello World"즉시 결과 바로 실행됩니다. 얼마 후, 데이터베이스 동작 완료는 오직 다음 쿼리 등록 된 콜백을 행의 결과 변수의 값을 설정하고 호출 처리된다.

    그것은 하나 개의 비동기 동작은 다른 비동기 방식으로 작동 할 가능성이,이 제 2 동작은 큐에 배치되며, 그 큐의 앞에 올 때 처리된다. 비동기 작업에 등록 된 콜백을 호출하면이 완료되면 자바 스크립트 실행 시간이 작업의 결과를 반환하는 방법입니다.

    이 콜백을 요구하는 경우 비동기 인 자바 스크립트를 작동 아는 간단한 방법은 메모입니다 - 콜백이 첫 번째 작업이 완료되면 실행 얻을 것이다 코드입니다. 문제의 두 가지 예에서, 우리는 두 번째 경우는 콜백을 가지고 볼 수 있으므로 두의 비동기 작업입니다. 이 때문에 비동기 작업의 결과를 처리하는 다른 스타일의 항상 그런 것은 아니다.

    약속에 대해 읽어 더 많은 내용. 약속은 비동기 작업의 결과가 처리 할 수있는 또 다른 방법입니다. 약속의 좋은 점은 코딩 스타일이 더 동기 코드 같은 느낌이다.

    노드 'FS'와 같은 많은 도서관, 일부 작업 모두 동기 및 비동기 스타일을 제공합니다. 설정 파일 읽기의 경우처럼 - - 작업이 오래 걸리지 않고 많이 사용하지 않는 경우 동기 스타일의 작업을 쉽게 읽을 수 코드가 발생합니다.


  5. 5.SQL 쿼리 실행이 완료 될 때까지 동기 경우, CONSOLE.LOG 명령이 실행되지 않습니다.

    SQL 쿼리 실행이 완료 될 때까지 동기 경우, CONSOLE.LOG 명령이 실행되지 않습니다.

    비동기 경우, CONSOLE.LOG 명령을 직접 실행됩니다. 쿼리의 결과는 다음 언젠가 나중에 "콜백"기능에 의해 저장됩니다.


  6. 6.가장 큰 차이점은 비동기 프로그래밍, 당신이 그렇지 않으면 실행을 중단하지 않는 것입니다. '요청'제작되는 동안 다른 코드를 실행을 계속할 수 있습니다.

    가장 큰 차이점은 비동기 프로그래밍, 당신이 그렇지 않으면 실행을 중단하지 않는 것입니다. '요청'제작되는 동안 다른 코드를 실행을 계속할 수 있습니다.


  7. 7.함수 번째 비동기한다.

    함수 번째 비동기한다.

    프로그램이 각 행을 기다리는 첫 번째 힘은 다음 하나 계속하기 전에이를 실행할 것칩니다. 두번째는, 각 라인은 함께 (독립적) 한 번에 실행될 수있다.

    언어 및 프레임 워크 비동기 또는 동시성 실시간 전송 (예. 채팅, 주식 응용 프로그램)이 필요한 것들에 대한 대단한 수 (JS, Node.js를).


  8. 8.동기화 프로그램

    동기화 프로그램

    C, C #, 자바 같은 프로그래밍 언어 그렇게도 당신이 당신의 쓰기의 순서로 실행됩니다 무엇을 쓰기 동기화 프로그램입니다.

    -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 작업에서 가정을의, nodejs가 마무리 될 작업에 대한 유휴 대기를 유지하지 않습니다, 그것은 ' 큐에서 다음 작업을 실행을 시작할 것이다, 그 시간의 촬영 작업이 완료 때마다 콜백을 사용하여 통지합니다. 다음 예는 도움이 될 것입니다 :

    //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 + 처리 시간) 밀리가 비동기 시간을 절약 할 곳의 차이는 분명하다.


  9. 9.비동기 기능이없는 동안 동기 기능이 차단된다. 동기 기능으로, 다음 명령문 전에 완전한 문장이 실행됩니다. 문 중 하나가 시간이 오래 걸릴 경우이 경우, 프로그램이 정확하게 진술과 프로그램의 실행의 순서대로 평가되고 일시 중지됩니다.

    비동기 기능이없는 동안 동기 기능이 차단된다. 동기 기능으로, 다음 명령문 전에 완전한 문장이 실행됩니다. 문 중 하나가 시간이 오래 걸릴 경우이 경우, 프로그램이 정확하게 진술과 프로그램의 실행의 순서대로 평가되고 일시 중지됩니다.

    매개 변수 및 실행이 비동기 함수가 호출 후 즉시 다음 줄에 계속 비동기 기능은 일반적으로 콜백을 받아들입니다. 비동기 작업이 완료되고 호출 스택이 비어있을 때 콜백 만 호출됩니다. 이러한 웹 서버 또는 데이터베이스를 쿼리에서 데이터를로드 등 중부 작업이 비동기 그래서 메인 스레드가 다른 작업을 실행하는 대신 전체에 그렇게 오래 작동 할 때까지 계속 차단 할 수있는 수행해야합니다 (브라우저의 경우, UI는 동결) .

    원래는 Github에서에 게시 됨 : 링크


  10. 10.동기

    동기

    비동기

    예:

    //이 함수는 동기 로그 함수 (ARG) { CONSOLE.LOG (ARG) } (1) 기록; //이 함수는 비동기 에서는 setTimeout (() => { CONSOLE.LOG (2) }, 0); 로그 (3)

  11. from https://stackoverflow.com/questions/16336367/what-is-the-difference-between-synchronous-and-asynchronous-programming-in-node by cc-by-sa and MIT license