동기와 비동기, 블로킹과 논블로킹 이 두 가지 개념은 단지 조합하여 사용되는 것일 뿐 서로 전혀 다른 곳에 초점을 맞춘 개념들로 직접적인 관련은 거의 없다.
Synchronous : 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작
Asynchronous : 시작, 종료가 일치하지 않으며, 끝나는 동시에 시작을 하지 않음
👉🏻 카페에서 한 사람씩 주문을 받아 하나씩 처리하는 것 : 동기
👉🏻 카페에서 주문을 받아 처리하되 순서대로가 아니라 다른 주문도 함께 처리하는 것 : 비동기
호출하는 함수 A가 호출되는 함수 B의 작업 완료 후 리턴을 기다리거나, 바로 리턴 받더라도 미완료 상태라면 작업 완료 여부를 스스로 계속 확인
함수 A가 함수 B를 호출할 때 콜백 함수를 함께 전달해서, 함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행한다.
함수 A는 함수 B를 호출한 후로 함수 B의 작업 완료 여부에는 신경쓰지 않는다.
처리되어야 하는 하나의 작업이 전체적인 흐름을 막느냐, 안 막느냐에 대한 관점
👉🏻 제어권이 누구한테 있느냐 가 관심사
Blocking : 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것
Non-Blocking : 다른 주체의 작업에 관련없이 자신의 작업을 하는 것
A 함수가 B 함수를 호출하면, 제어권을 A가 호출한 B 함수에 넘겨준다.
A 함수가 B 함수를 호출해도 제어권은 그대로 자신이 가지고 있는다.
함수 A는 함수 B의 리턴값을 필요로 한다. 👉🏻 Sync(동기)
그래서 제어권을 함수 B에게 넘겨주고, 함수 B가 실행을 완료하여 리턴값과 제어권을 돌려줄 때까지 기다린다. 👉🏻 Blocking(블로킹)
ex) python 코드 실행 후 커맨드에서 입력 받기
👉🏻 제어권이 시스템에서 사용자로 넘어가, 리턴값을 필요로 해서 사용자가 입력할 때까지 기다린다.
A 함수는 B 함수를 호출.
이때 A 함수는 B 함수에게 제어권을 주지 않고, 자신의 코드를 계속 실행한다. 👉🏻 Non-Blocking(논블로킹)
그런데 A 함수는 B 함수의 리턴값이 필요하기 때문에, 중간중간 B 함수에게 함수 실행을 완료했는지 물어본다. 👉🏻 Sync(동기)
ex) 게임 로딩 중 프로그레스 바
데이터를 계속 물어봄. 제어권은 여전히 나한테 있어 화면에 로드율이 표시된다.
👉🏻 논블로킹으로 자신의 작업을 계속하고 있지만 다른 작업과의 동기를 위해 계속해서 다른 작업이 끝났는지 조회
A 함수는 B 함수를 호출.
이때 제어권을 B 함수에 주지 않고, 자신이 계속 갖고 있는다. 따라서 B 함수를 호출한 이후에도 멈추지 않고 자신의 코드를 계속 실행한다. 👉🏻 논블로킹
그리고 B 함수를 호출할 때 콜백함수를 함께 준다. B 함수는 자신의 작업이 끝나면 A 함수가 준 콜백함수를 실행한다. 👉🏻 비동기
ex) AJAX 요청 / JS 비동기 콜백
👉🏻 프론트엔드에서 서버로 api 요청을 보내고, 응답을 기다리지 않고 바로 자신의 다음 일을 계속 실행한다.
마주치기 어려움. 패스😛
참고 블로그 : https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC
예시가 잘 나와있다. 나중에 들어가서 더 보기