본문으로 바로가기

Async/sync, Blocking/Non-Blocking

category 컴퓨터공학 2020. 8. 14. 18:03

동기(Synchronous)와 비동기(Asynchronous) 개념

 

  • 동기는 요청과 그 결과가 동시에 일어난다는 뜻이며,
    예를 들어 호출한 함수가 호출된 함수의 작업이 끝나서 결과값을 반환하기를 기다리거나, 지속적으로 호출된 함수에게 확인 요청을 하는 경우가 있다. 
    • 메소드 리턴 시간과 결과를 전달받는 시간이 일치하는 경우
    • 2개 이상의 쓰레드가 동시에 작업을 시작하는 경우(예를 들면 자바에서 CyclicBarrier)
    • 예제) 
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();

 

 

  • 비동기는 요청과 그 결과가 동시에 일어나지 않는다는 뜻이며,
    호출하는 함수가 호출되는 함수에게 작업을 맡겨놓고 신경을 쓰지 않는 것을 말한다.

    • 예제)
setTimeout( foo, 3000);

function foo(){
    console.log("2");
}
console.log("1");

 

 

블로킹(Blocking)과 논블로킹(Non-Blocking) 개념

  • 블로킹은 자신의 수행결과가 끝날 때까지 제어권을 갖고 있는 것을 의미한다.
  • 논블로킹은 자신이 호출되었을 때 제어권을 바로 자신을 호출한 쪽으로 넘기며, 자신을 호출한 쪽에서 다른 일을 할 수 있도록 하는 것을 의미한다.

동기/비동기, 블로킹/논블로킹의 차이

 

<동기/비동기, 블로킹/논블로킹의 차이를 나타내는 그림>

 

 

일반적으로 동기와 블로킹 / 비동기와 논블로킹의 조합이 익숙하며, 사실은 동기와 비동기를 소개할 때 사용했던 예제들은 그 내부에 blocking과 non-blocking 개념이 깔려있다.

 

 

1) 블로킹

동기 예제 코드에서는 사용자가 입력할 때까지 프로그램은 어떠한 동작도 수행하지 않는다.

즉, 사용자가 입력할 때까지 제어권은 nextInt()메서드에게 존재하며, 사용자가 입력을 해야만 제어권이 넘어가서 이후의 코드가 수행된다.

이처럼 수행 결과가 끝날 때까지 제어권을 갖고 있는 것이 blocking 방식이다.

 

2) 논블로킹

비동기 예제 코드의 수행 결과는 1, 2가 순서대로 출력된다.

그 이유는 setTimeout(foo, 3000) 함수를 호출할 때 제어권을 바로 반납하기 때문이다.

즉, 3초 뒤에 foo() 함수가 실행이 되지만, 제어권을 반납했기 때문에 바로 다음 코드인 console.log("1")가 수행이 된다.

그리고 나서 3초라는 시간이 흘렀다는 이벤트가 발생하여 콜백 함수인 foo() 함수가 수행이 되는 것이다.

이처럼 제어권을 바로 반납하는 방식을 non-blocking 방식이라 한다.

 

 

 

Spring Webflux 에서 제공하는 WebClient라는 모듈을 찾아보다가 reactive, non-blocking 이라는 개념이 나왔다.

Spring 3.0부터는 RestTemplate 이라는 모듈이 있었는데 5.0 부터 WebClient 라는 모듈이 추가되었다.

 

둘 다 REST 방식으로 API 요청을 하는 용도이고 차이점이 있다면

RestTemplate은 동기적인 방식이고 WebClient는 비동기적으로 요청을 할 수 있다고 한다.

대규모 요청, 실시간 처리를 해야할 때 WebClient을 사용한다고 함..

 

Webflux 찾아보다가 이런 개념까지 거슬러 올라가게 됐는데 Webflux... 쉽지 않은 듯하다

공부할 게 넘쳐나는군 하하

 

'컴퓨터공학' 카테고리의 다른 글

카카오 로그인 연동시 CORS 개념 정리  (0) 2021.11.22
JWT(Json Web Token)란?  (0) 2021.06.09
HTTP GET, POST 방식에 대해  (0) 2020.12.07
jsessionid란??  (0) 2019.11.26