동기처리와 비동기, 블로킹과 논블로킹처리 혼합하여 사용할 시
이 개념들이 서로 뭔가 연관이 있는 것으로 오해하기 쉽다. 아무래도 동기와 블록킹, 비동기와 논블록킹의 작동 매커니즘이 더 직관적이기 때문에 많은 사람들이 이 개념들을 같은 것 혹은 비슷한 것으로 오해하고 있는데, 이 두가지 개념은 서로 전혀 다른 곳에 초점을 맞춘 개념들이므로 서로 직접적인 관련은 거의 없다고 봐도 된다. 단지 조합하여 사용되는 것 뿐
동기와 비동기는 프로세스의 수행 순서 보장에 대한 매커니즘이고
블록킹과 논블록킹은 프로세스의 유휴 상태에 대한 개념으로 완전한 별개의 개념
동기를 블로킹처럼 처리
a는 b의 리턴 값을 필요(동기), 그래서 제어권을 b에게 넘겨주고 b가 실행을 완료하여 리턴 값과 제어권을 돌려줄 때까지 기다린다(블로킹)
동기를 논블로킹처럼 처리
a는 b를 호출, 이 떄 a는 b에게 제어권을 주지 않고 자신의 코드를 계속 실행(논블로킹)
그런데 a는 b의 리턴 값이 필요하기 떄문에 중간 중간 b에게 함수 실행을 완료했는지 물어본다(동기)
논블로킹인 동시에 동기
비동기 논블로킹처리
a는 b를 호출, 이 떄 제어권을 b에게 주지 않고 자신이 계속 가지고 있는다(논블로킹)
따라서 호출 후 자신의 코드를 계속 실행. 또한 b를 호출 시 콜백함수를 함께 주는데 b는 자신의 작업이 끝나면 a가 준 콜백 함수를 실행(비동기)
비동기를 블로킹처리(쓸 일이 거의 없음)
a는 b 리턴 값을에 신경쓰지 않고, 콜백함수를 보낸다(비동기) 그런데 b의 작업에 관심없음에도 불구하고 a는 b에게 제어권을 넘긴다(블로킹)
따라서 a는 자신과 관련 없는 b의 작업이 끝날 때 까지 기다린다?…