동기, 비동기
sync, async, blocking, non-blocking 알아보기
Sync 와 Async
동기 방식
동기 방식은 함수의 결과를 대기 하기 때문에 시간이 오래 걸리는 함수를 사용자가 모두 감당하기엔 유저 경험이 떨어질 수 있다.
하지만, 무작정 긴 대기 시간을 기다려야 한다고 사용하지 말아야 할 동작 방식일까?
대부분의 프로그래밍을 하게 되면 초기엔 동기 방식으로 동작하게 설계하며 논리적 흐름대로 작성하면 되기 때문에 구현이 굉장히 간단하다.
실행을 제어하는 함수가 대기하고 있기 때문에 에러가 발생하는 지점을 추적하기 용이하다.
하나의 함수가 반환하는 결과를 필요로하는 의존 관계에 효율적이다.
예를 들어, 은행 업무를 보고 있다고 가정해보자.
은행의 대부분 인터넷 업무들은 한 번에 한 명의 사용자만 접근이 가능한데, 만약 내가 은행 사이트에 있는 정보를 가져오기 위해 로그인 하고 데이터를 추출하는 프로그램을 만들었다.
처음엔 동기 방식으로 구성하여 한 번의 데이터를 추출할 때 너무 긴 시간이 걸려서 비동기를 사용하고자 모두 개선했다.
데이터가 갑자기 추출되지 않는다. 어떤 문제가 있을까?
당연, 비동기 통신으로 인해 현재 로그인 한 사용자가 로그아웃 하지 않고 다시 로그인을 시도하게 되어 동시 접속으로 인해 데이터를 가져오지 못하게된다.
이런 경우엔 동기 방식으로 데이터를 가져와야하는데, 과연 비동기는 전지전능 하지 않다.
비동기 방식
요즘의 생성형 AI 가 사용자에게 답변을 제공하기 까지 수 초가 소요된다. 사용자는 AI 의 답변을 기다릴 때 까지 화면이 멈추고 현재 페이지에서 다른 동작을 못한다고 하면 우린 10초가 걸렸을 때 한 화면만 보고 있을 수 있을까?
이렇게, 내가 결과를 기대하지 않고 실행에만 중점을 두며 결과는 함수가 반환 되었을 때 받도록 구성할 수 있는 비동기 동작 방식은 많은 사용자에게 편리성을 주었다.
하지만, 비동기 동작 방식은 실행 흐름이 보장 되지 않는다.
비동기의 달콤함이 사용자에게 어떤 고통스러운 보상을 선물할까?
비동기 동작 과정에서 중간에 동기식 코드가 섞여 있으면, 그 부분에서 블로킹되어 전체 흐름이 느려진다
함수 호출 결과의 순서를 보장하지 않기 때문에 첫 번째 함수가 두 번째 함수보다 먼저 도착하리란 보장이 없다.
여러 비동기 작업이 있을 때, 각 작업의 완료 시점을 예측하기 어렵다. 따라서 의도한 순서대로 실행되도록 제어하는 복잡한 로직이 필요할 수 있다
Last updated