지식/Web

동기/비동기(Sync/Async), Blocking/Non-Blocking

뭉지(moonz) 2021. 9. 17. 15:49
반응형

시작하기에 앞서, 간단히 기준이 되는 용어를 보겠습니다.

  • Blocking/Non-Blocking : '제어권'을 두고 구분
  • 동기/비동기 : 결과값을 기다리느냐로 구분

 

1. Blocking VS Non-Blocking : 제어의 관점

요청한 처리되어야하는 작업이 전체 작업 흐름을 막는지 안 막는지?

🚩 Blocking 

  • 작업에 대한 제어권이 없다.
  • 즉, 다른 주체에게 작업을 요청하면 결과가 돌아올 때까지 다른 작업을 하지않고 기다려야 한다.
    1. A함수가 B함수를 호출하면, 제어권을 B함수에게 넘긴다.
    2. B함수가 자신의 함수를 실행하고, A함수는 제어권이 없기 때문에 함수 실행을 잠시 멈춘다.
    3. B함수의 실행이 끝나면 자신의 제어권을 호출한 A에게 돌려준다.

🚩 Non-Blocking

  • 작업에 대한 제어권을 그대로 가지고 있다.
  • 즉, 다른 주체에게 작업을 요청하고 나의 작업을 할 수 있다.
  1. A함수가 B함수를 호출하면 B함수는 실행되지만,
  2. A함수가 제어권을 가지고 있으므로 A함수도 계속 실행할 수 있다.

 

2. 동기(Synchronous) VS 비동기(Asynchronous) : 결과(처리)와 순서의 관점

처리해야할 작업에 대해 완료 여부를 신경쓰는지 안쓰는지?

🏁 동기 (Sync)

  • 함수 A가 함수 B에게 작업을 요청하면, 함수 B는 의 작업 완료 후 리턴을 할 텐데 이 응답을 계속 체크하면서 확인하는 것이 Synchronus이다.
  • 함수 A의 코드를 실행하다가 요청한 작업의 결과가 리턴됐는지 체크하다가 작업의 결과가 돌아오면 바로 처리를 한다.

🏁 비동기 (Async)

  • 함수 A가 함수 B를 호출할 때 콜백 함수를 전달하여 함수 B의 작업이 완료되면 콜백함수가 실행된다.
  • 함수 B를 호출하고나면, 함수 A는 함수 B의 작업 완료 여부는 신경쓰지 않는 것이 Asynchronus이다. 
  • 요청한 작업의 결과에 큰 비중을 두지않는다.


예시

(1) Sync - Blocking

  • A 주체는 B 주체에게 작업을 요청한 동안 A 작업을 하지않고 기다리다가(Blocking), 결과가 돌아오면 바로 결과를 처리한다.(Sync)
  • 사용자에게 입력을 요청하는 경우 (java의 Scanner 라이브러리)
  • 커맨드 창에서 입력받는 경우

 

(2) Sync - Non-Blocking

  • A 주체가 B 주체에게 작업을 요청한 동안, A 작업을 계속 실행하면서 중간중간 완료되었는지 체크하다가(Non-Blocking),  결과가 도출되면 바로 처리한다.(Sync)
  • 게임에서 맵을 이동할 때 해당 맵 데이터를 물어보면서, 유저에게 로드율이 어느정도인지 보여주는 경우

 

(3) Async - Blocking

  • A 주체가 B 주체에게 콜백함수를 보내는데, B함수의 리턴값에 신경쓰지 않는다. (Async)
  • 그럼에도 A주체는 작업을 하지못하고 기다리다가(Blocking), B 주체가 자신의 할일이 끝나고 콜백함수를 호출하면서 제어권을 넘겨준다.도출된 결과를 바로 처리하지않아도 된다.(Async)
    • ??? 무슨소리야. 비동기인데 Blocking을 써야할 이유가 있어? 없음!!!!
    • 보통 Non-blocking/Async를 하려다 실수로 동작하게되는 경우 뿐이다.


(4) Async - Non-Blocking

  • A 주체는 B 주체를 호출하지만, 제어권을 주지 않기 때문에 A 주체의 코드를 계속 실행하고 (Non-Blocking), B 주체는 자신의 할일을 하고 나서 A주체로부터 받은 콜백 함수를 실행한다.(Async)
  • 프론트엔드 단에서 서버로 api 요청(ex: AJAX)을 하고, 서버의 응답을 기다리지 않고 자신의 작업을 계속 한다.
    fetch('url', option)
    .then((response) => {
      return response.json();
    })
    .then((data) => {
      something(data);
    });​

 

 

 참고 영상
반응형