관심사의 차이 #
키워드 | 관심사 |
---|---|
Blocking / Non-Blocking | 함수가 바로 응답하는지, 안하는지Blocking : 함수 호출 후 함수가 완료될 때까지 기다린다.Non-Blocking : 함수 호출 후 함수가 완료되는 것을 기다리지 않는다.= 즉, 함수를 호출한 곳에 제어권을 곧바로 넘겨준다. = 즉, 함수를 호출한 곳은 다른 일을 할 수 있다. |
Sync / Async | 함수의 ‘완료’를 누가 신경쓰는지Sync : 함수의 완료(응답)을 호출한 쪽에서 신경쓴다.Async : 함수의 완료(응답)을 호출당한 쪽에서 신경쓴다. (callback 함수) |
상황별 예시 #
아래와 같은 컴포넌트가 있다고 가정한다.
- A : 함수 호출자
- B : 함수 피호출자
Blocking Sync #
- 함수 호출 후, 응답(처리)를 기다린다. (Blocking)
- 함수 호출 후, 응답을 반환받는다. (Sync)
A ---> B
|
| B에서 처리가 완료될 때까지 기다린다.
| B에서 처리가 완료되면 결과를 반환받는다.
|
A <--- B
아래와 같은 예시가 있다고 한다.
- file.read()
- file.write()
- …
Blocking Async #
- 함수 호출 후, 응답(처리)를 기다린다. (Blocking)
- 함수 호출 후, 응답은 신경쓰지 않는다. - 피호출자에서 callback 함수를 통해 처리한다.
A ---> B
|
| B에서 처리가 완료될 때까지 기다린다.
| B에서 처리가 완료되면 callback 함수를 통해 처리한다.
|
A <--- B (callback)
이 경우는 이점이 없다.
Blocking 된 상태이기 때문에, 굳이 callback 함수를 통해 결과를 처리받지 않아도 된다. (직접 결과를 받으면 된다.)
참고한 글에서는 Non-Blocking + Async 의 방식을 시도했지만 Blocking 처리되는 부분이 있을 때 발생할 수 있는 조합이라고 설명한다. (즉, 의도하지 않은 사용으로 인해 발생할 수 있는 조합)
" NonBlocking-Async 방식을 쓰는데 그 과정 중에 하나라도 Blocking으로 동작하는 놈이 포함되어 있다면 의도하지 않게 Blocking-Async로 동작할 수 있다. “
아래와 같은 예시가 있다고 한다.
- Node.js + Mysql
Non-Blocking Sync #
- 함수 호출 후, 응답(처리)를 기다리지 않는다. (Non-Blocking) - 함수 호출자는 다른 일을 할 수 있다.
- 함수 호출 후, 응답을 반환받는다. (Sync)
// B에서 처리가 완료될 때까지 기다리지 않는다.
// B에서 처리가 완료되었는지 확인한다. (주기적으로 polling 하는 느낌과 비슷하다.)
A ---> B
A --- 다른 작업
A ---> B 결과 확인
A --- 다른 작업
A ---> B 결과 확인
A --- 다른 작업
A ---> B 결과 확인
A <--- B
아래와 같은 예시가 있다고 한다.
- Future.isDone() (
while(!Future.isDone()){...}
) - …
Non-Blocking Asnyc #
- 함수 호출 후, 응답(처리)를 기다리지 않는다. (Non-Blocking) - 함수 호출자는 다른 일을 할 수 있다.
- 함수 호출 후, 응답을 반환받는다. (Sync)
// B에서 처리가 완료될 때까지 기다리지 않는다.
// B에서 처리가 완료되면 callback 함수를 통해 처리한다.
A ---> B
A --- 다른 작업
A --- 다른 작업
A --- 다른 작업
A <--- B (callback)
아래와 같은 예시가 있다고 한다.
- asyncFileChannel.read()
- asyncFileChannel.write()
- …