Blocking과 Non-Blocking은 다른 주체가 작업할 때 자신의 제어권이 있는지 없는지로 구분한다.
자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것을 의미한다.
🐶(호출한 함수): 고양이님 서류 전달드리겠습니다.
🐱(호출된 함수): 강아지님 서류 검토 끝날 때까지 앞에서 기다리세요.
➡️ 호출된 함수(🐱)가 자신이 할 일을 모두 마칠 때까지 제어권을 계속 가지고서 호출한 함수(🐶)에게 제어권을 바로 돌려주지 않는 상황을 의미
다른 주체의 작업에 관련 없이 자신의 작업을 하는 것을 의미한다.
🐶(호출한 함수): 고양이님 서류 전달드리겠습니다.
🐱(호출된 함수): 강아지님 서류 주고 가세요.
➡️ 호출된 함수(🐱)가 자신이 할 일을 모두 마치지 않았더라도 바로 제어권을 호출 건네주어 호출한(🐶) 함수가 다른 일을 진행할 수 있도록 해주는 상황을 의미
Sync와 Async는 결과를 돌려주었을 때 순서와 결과에 관심이 있는지 없는지로 판단한다.
즉, 순서와 결과에 신경을 쓰느냐 안쓰냐의 차이이다.
동기라는 뜻으로 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미한다.
🐶(호출한 함수): 고양이님 서류 전달드리겠습니다.
🐱(호출된 함수): 강아지님 기다리거나 다른 일 하고 계세요. 강아지님 신경 안쓸게요.
(서류 읽는 중 ...)
🐱(호출된 함수): 강아지님 서류 이렇게 하세요.
🐶(호출한 함수): 고양이님 바로 처리하겠습니다.
➡️ 호출된 함수(🐱)의 수행 결과 및 종료를 호출한 함수(🐶)와 함께 신경 쓰는 경우를 의미
비동기라는 뜻으로 시작과 종료가 일치하지 않고 끝나는 동시에 시작을 하지 않음을 의미
🐶(호출한 함수): 고양이님 서류 전달드리겠습니다.
🐱(호출된 함수): 강아지님 기다리거나 다른 일 하고 계세요. 강아지님 신경 안쓸게요.
(서류 읽는 중 ...)
🐶(호출한 함수): 강아지님 서류 이렇게 하세요.
🐱(호출된 함수): 고양이님 나중에 내용 확인하고 언젠가 처리하겠습니다.
➡️ 호출된 함수(🐱)의 수행 결과 및 종료를 호출된 함수(🐱) 혼자 직접 쓰고 처리하는 경우를 의미
결과와 순서 | 제어권 |
---|---|
O | O |
호출되는 함수(B)가 바로 제어권을 돌려주며 호출한 함수(A)는 다른 작업을 수행할 수 있으나,
호출한 함수(A)는 호출되는 함수(B)의 결과를 처리해야하기 때문에 언제 종료되는지 알 수 없는 호출되는 함수(B)의 종료를 반복적으로 물어봐야한다
➡️ 호출한 함수(A)가 다른 작업을 수행할 수 있었음에도 불구하고 여전히 호출된 함수(B)의 결과에만 신경쓰기에 제 할 일을 못하게 되는 형태가 된다!
🐶 : 고양이님 서류처리 부탁드립니다.
🐱 : 강아지님 다른 일을 하고 계세요.
🐶 : 네.
🐱 : (서류 처리 중)
🐶 : 고양이님 서류처리 끝났나요?
🐱 : 강아지님 아직이요.
🐶 : 고양이님 서류처리 끝났나요?
🐱 : 강아지님 아직이요.
🐶 : 고양이님 서류처리 끝났나요?
🐱 : 네.
결과와 순서 | 제어권 |
---|---|
X | X |
최악의 조합일 수 있다. 호출한 함수(A)는 호출되는 함수(B)의 작업 결과가 관심 없음에도 호출되는 함수(B)의 결과를 기다리고 있어야 한다.
🐶 : 고양이님 서류처리 부탁드립니다.
🐱 : 강아지님 처리가 끝날 때까지 기다리세요.
🐶 : 고양이님이 어떤 작업을 하던 저와는 관계없지만 기다릴게요.
이 조합은 큰 이점이 없어 이 방식을 사용할 필요는 없으나 의도치 않게 이 형태로 동작하는 경우가 있다고 한다. 대표적으로 NodeJS와 MySQL의 조합에서 나온다고 한다.
NodeJS에서 콜백 지옥을 해치면서 Async로 전진해도, 결국 DB 작업 호출 시에는 MySQL에서 제공하는 드라이버를 호출하게 되는데, 이 드라이버가 Blocking 방식으로 동작하여 Async+Blocking 구조가 된다고 한다. (Java의 JDBC도 동일하다고 한다.)
결과와 순서 | 제어권 |
---|---|
X | O |
결과와 순서 | 제어권 |
---|---|
O | X |