이건 그냥 제가 공부했습니다~ 하는 느낌으로 살짝 말만 바꿔서 쓴거라 혹시라도 누군가 이 글을 발견한다면
https://velog.io/@nittre/%EB%B8%94%EB%A1%9C%ED%82%B9-Vs.-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-Vs.-%EB%B9%84%EB%8F%99%EA%B8%B0
그림도 있고 잘 작성된 원래 글을 읽으시길 바랍니다.
동기/비동기, 블로킹/논블로킹은 해당 함수나 프로세스가 끝났는지 확인하기 위한 방법으로, 끝났는지 확인하는데 필요한 모든 곳에서 쓰일 수 있는 개념이다. 운영체제에서나...
사실 JS 공부를 위해서라면 동기/비동기 정도만 이해해도 된다.
함수를 호출할 때 해당 함수가 끝났는지 호출한 쪽에서 즉 리턴을 했는지 신경 쓰는 것이 동기이다.
code1
function1()
code2
식으로 있을 때 차례대로 code1, function1(), code2 앞의 실행이 끝나야 끝날 것이다. 일반적이다.
함수를 호출할 때 해당 함수가 끝났는지 호출한 쪽에서 신경 쓰지 않는다. 대신 보통 콜백 함수를 넘겨서 호출된 함수가 끝나면 콜백 함수가 실행된다. 코드의 실행순서는 호출된 함수가 언제 끝나느냐에 따라 달라질 것이다.
호출한 함수에게 제어권을 넘겨준다. 즉 호출한 쪽은 호출한 함수가 리턴값과 돌아올때까지 멈춘다.
그냥 호출하고 자기도 쭉 실행된다.
이렇게 보면 동기는 무조건 블로킹이고 비동기는 논블로킹 아니야? 라고 생각하게 된다. 물론 대부분 그 둘둘 조합이긴한데, 다른 쪽과의 조합도 가능하다.
동기 | 비동기 | |
---|---|---|
블로킹 | 제어권을 넘기면서 호출하고, 값이 돌아오면 실행된다 | 리턴값을 안 받는데 제어권을 넘기는 바람에 멈춘다. 호출한 함수가 끝나면 제어가 돌아오면서 실행한다 |
논블로킹 | 제어권을 안 넘기고 호출한다, 리턴값이 돌아오는지 계속 요청을 보내면서 끝났는지 물어본다. 폴링 방식으로... 끝나면 받는다. | 제어권을 넘기지 않고 그냥 호출해서 요청을 보내고(+콜백을 넘기거나 하고) 나는 계속 실행한다. |
논블로킹일때는 동기/비동기 선택지가 있다.(그래도 논블로킹 비동기가 일반적이고 더 효율적으로 보인다.)
근데 블로킹 비동기를 보면 그냥 블로킹 동기랑 작동이 같다. 비동기는 보통 코드가 절차적으로 가지 않고 순서가 조정된다는 느낌으로 이해하게 되는데 블로킹 비동기는 그냥 차례대로 간다... 블로킹이면 차례대로 실행된다. 그걸 강제한다. 그러니까 블로킹 비동기는 작동 차이도 없고 쓸모도 없어보인다.