티스토리 뷰

요즘 Reactor 기반의 RxJava, Spring Webflux 등의 기술들이 내세우는 점이 Asynchronous & Non-Blocking 기반 방식이라는 점이다. 그래서 Webflux를 학습하기 전에 Sync, Async, Blocking, Non-Blocking에 대한 개념을 한번 정리하고자 한다.

 

Synchronous (동기) vs Asynchronous (비동기)

먼저 Synchronous의 어원을 보면 syn -> together, chronous -> time을 의미한다. 그래서 두 가지 이상이 함께 시간을 맞춘다 (동기) 라는 의미이다. Asynchronous는 Synchronous에 부정 접두사인 a가 붙은 것으로 두 가지 이상이 서로 시간을 맞추지 않는다 (비동기) 라는 의미이다.

그래서 동기/비동기를 언급할 때는 '무엇과 무엇이?' 그리고 '어떤 시간을?' 맞춘다는 것인지 확실히 해야함.

그래서 동기의 의미를 좀 더 풀어보면 아래와 같다.

 A와 B가 함께 간다고 할 때, 두 가지가 동시에 시작하거나 동시에 종료하거나 하면 동기라고 할 수 있다.

예로 들면 A, B 쓰레드가 동시에 작업을 시작하면 동기라고 할 수 있다. 또한 메소드 호출 레벨에서 보면 메소드 리턴시간(A)과 결과를 전달받는 시간(B)이 일치하면 동기라고 할 수 있다.

뿐만 아니라 위와 같은 A가 끝나는 시간과 B가 시작하는 시간이 같은 케이스 (Java의 synchronized, BlockingQueue)도 동기라고 볼 수 있다.

 

Blocking vs Non-Blocking

블로킹, 논블로킹은 동기, 비동기와는 관점이 전혀 다르다.

블로킹, 논블로킹은 내가 직접 제어할 수 없는 제 3의 대상을 내가 어떤 식으로 상대할 것이냐의 측면에서 보는 것이다. 그렇기 때문에 블로킹, 논블로킹으로 구분해서 설명할 수 있는 대상이 제한적이다.

구체적으로 예시를 들면 내가 어떤 메소드를 호출해서 뭔가를 받아와야 할 때, 그 받아와야하는 대상의 데이터가 내가 통제하지 못하는 외부의 제 3의 존재로부터 Input을 받는다, I/O가 일어난다 하는 경우, 혹은 나 말고 다른 쓰레드가 존재해서 뭔가 작업을 하다가 어느 순간에 그 쓰레드부터 결과를 확인 받거나 그 쓰레드가 종료하는 걸 확인하고 넘어가야 하는 상황을 블로킹, 논블로킹으로 구분해서 설명할 수 있다.

function Caller() {
  functionA();
  functionB();
  functionC();
}
function functionA() {
  ...
  return something;
}

위의 코드에서 Caller가 functionA()를 호출하고 functionA()가 응답을 줄 때까지 기다리겠다 하면 블로킹인 것이고, Caller가 functionA()가 응답을 주지 않았더라도 이후 로직을 계속 수행하겠다 이게 논블로킹이라고 보면 될 것이다.

 

[참고 및 출처]

www.youtube.com/watch?v=HKlUvCv9hvA&t=637s

www.youtube.com/watch?v=IdpkfygWIMk

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함