주중에 동료의 세미나에 참가했다가 받았던 질문
sync async와 blocking, non-blocking의 차이를 아시나요?
흠... 똑같은거 아닌가?
그 세미나에서 호되게 교육당했고 이후 나름 이것 저것 검색했다...
공식문서에 집착하는 내 성격따라 일단 공식 문서 먼저 찾아보기로 했다.
그런데, 이 개념들은 어떤 언어나 프레임워크에 종속되지 않지 않던가?
공식 문서가 아니라 CS 전공 서적을 뒤져봐야 할 판이 되었다...
게다가 원체 혼동되는 개념인지라,
여기저기서 설명하는 방식이 모두 다르다.
심지어 MDN Asynchronous JS 문서에 따르면,
Asynchronous JS는 blocking 동작을 핸들하는데 유용하다고 한다.
이는 내가 지금까지 찾아본 블로그 글들을 참조하면 틀린 설명이다.
그런데 공식 문서에서 저렇게 설명하니 머리가 더욱 복잡해진다...
돌고 돌아 검색하게된 stackoverflow의 글에서조차 의견이 갈린다.
그래서 시간의 순서대로 내가 내린 결론을 쭉 나열하겠다..
정의는 그때그때 다르다.
어쩔 때는 non-blocking이 async와 같은 의미로 사용된다.
async 동작을 호출하고 다른 동작을 수행할 수 있다.
결과가 산출되면 어떤 방식으로 호출자에게 반환된다.
non-blocking은 아주 빠르게 리턴 해주는 동작이다.
아주 빠른 block이라고 생각해도 좋다.
결과값은 쓰레기값(혹은 on-going)과 정상값 둘 중 하나가 나온다.
sync, async는 두 동작 사이의 관계
blocking, non-blocking은 한 동작의 상황
async는 호출된 동작이 종료될 때까지 다른 일을 하는 것이고
non-blocking 동작은 다른 동작을 호출하고 다른 일을 하면서 계속 결과를 직접 확인하는 것.
확실한 결과를 내리진 못했지만 어렴풋이 감이 잡힌다.
여러 아티클의 설명이 조금씩 상이하지만
공통적으로 아래와 같은 설명이다.
호출한 동작이 끝나기 전에 다른 일을 할 수는 있지만,
호출한 동작의 종료를 직접 확인해야 한다.
호출한 동작이 끝나기 전에 다른 일을 한다.
호출한 동작이 끝나면 알아서 결과가 반환되고 정해진 방식으로 결과를 처리할 수 있다.
JS의 promise
나 callback
에 적용해서 보면 이해가 쉬울듯 싶다.
흠,
그런데 이렇게 보면 async가 발전된 형식의 non-blocking처럼 보인다...