앞서서 동기와 비동기, 블록킹과 논블록킹에 대해 조사하다 이해하는데 도움이 된 글을 발견해서 가져와본다.
시나리오1은 일반적인 회사의 작업 '흐름'입니다. 개발팀장이 사원들에게 업무를 지시하고 사원들은 본인이 맡은 일을 수행한 후에 개발팀장에게 본인의 작업을 보고하는 방식입니다.
여기서 개발팀장이 업무들을 '비동기적' 방식으로 처리하고 있습니다. 그리고 사원들은 본인의 작업을 '논블로킹' 방식으로 수행합니다.
만약에, 개발팀장이 업무를 '동기적'으로 처리한다면 아래와 같은 시나리오가 발생됩니다.
전체적인 작업의 흐름을 제어하는 개발팀장이 사원에게 업무를 지시하고, 그 사원이 해당 업무를 끝내고 보고 받을 때 까지 기다리게 됩니다.
사원2와 사원3은 업무만 지시된다면 성실하게 수행할 준비가 되어있지만, 개발팀장의 작업 흐름상 앞선 사원의 일이 끝날 때까지 작업을 진행하지 못하게 됩니다.
만약에, 개발팀장이 업무를 '비동기적'으로 처리하지만 사원들이 업무를 '블로킹'하게 진행한다면 아래와 같은 시나리오가 발생됩니다.
개발팀장이 '비동기적'으로 작업을 진행하고 싶다하여도, 사원들이 개발팀장을 붙잡는다면 (blocking) 개발팀장은 사원들의 업무가 끝나고 보고 될 때까지 기다리게 됩니다.
(시나리오2와 동일하게 진행됩니다.)
동기-비동기를 말하고자 한다면 개발팀장에 입장에서, 그리고 블로킹-논블로킹을 말하고자 한다면 사원의 입장에서 생각해야 합니다. (그리고 개발팀장도 상사에게 업무를 지시 받게 된다면 블로킹vs논블로킹 관점에서 생각해볼 수 있습니다.)
이를 조합하면 4가지에 경우가 발생되며, 비동기(async)+논블로킹 방식이 갖는 장점은 다른 3가지 경우에 비교하여 독보적이라 할 수 있습니다. 흔히 '비동기로 처리했다' 라는 말을 주로 사용하는데 이는 수행하고자 하는 작업이 '논블로킹'임을 내포하는 말입니다.
이렇게만 보면 '동기' 혹은 '블로킹' 방식이 효율적이지 못한 방식같지만, 순차적으로 작업이 처리되어야 한다면 '동기' 혹은 '블로킹' 방식을 사용해야 합니다.