[Operating Systems] 비동기 대기큐와 Promise 기초
실제로 비동기 작업을 어떻게 관리하고 처리하는지 구체적인 방법들을 알아보고자 한다.
비동기 작업을 언제, 어떤 방식으로 처리할지 결정하는 것이 핵심이다. 즉시 처리할지, 나중에 처리할지, 아니면 특정 시간에 처리할지에 따라 다른 전략이 필요하다.
🕐 비동기 처리 방식들
비동기 처리에는 작업을 언제 실행할지에 따라 여러 가지 방식이 있다. 각각의 특성과 용도를 이해하고 상황에 맞게 선택하는 것이 중요하다.
⏩ 즉시 실행 (SyncQueue)
동기 방식은 이벤트가 발생하면 즉시 모든 핸들러를 순서대로 실행하는 방식이다. 모든 처리가 끝날 때까지 다음 이벤트를 처리하지 않는다.
운영체제에서 인터럽트가 발생했을 때 인터럽트 핸들러가 즉시 실행되는 것과 비슷하다. 인터럽트 처리가 완료될 때까지 다른 인터럽트는 대기하거나 우선순위에 따라 처리된다.
마치 식당에서 주문을 받으면 그 요리를 완전히 만들어서 서빙하고 나서야 다음 주문을 받는 것과 같다.
특징
- 예측 가능한 순서: 핸들러들이 등록된 순서대로 실행
- 즉시 결과 확인: 처리 결과를 바로 확인할 수 있음
- 블로킹 가능성: 무거운 작업이 있으면 전체가 멈춤
- 높은 우선순위: 중요한 이벤트 처리에 적합
🔄 나중에 실행 (AsyncQueue)
비동기 방식은 이벤트가 발생했을 때 핸들러들을 큐에 넣어두고, 이벤트 루프가 나중에 처리하는 방식이다. 이벤트를 발생시킨 코드는 즉시 다른 일을 계속할 수 있다.
운영체제의 작업 스케줄러와 비슷한 개념이다. 프로세스들을 준비 큐에 넣어두고 스케줄러가 적절한 시점에 CPU를 할당해서 실행한다.
마치 패스트푸드점에서 주문을 받고 번호표를 주면, 요리가 완성되면 번호를 부르는 것과 같다. 손님은 기다리는 동안 자리에 앉거나 다른 일을 할 수 있다.
특징
- 논블로킹: 이벤트 발생 코드가 멈추지 않음
- 높은 처리량: 여러 이벤트를 빠르게 연속 처리 가능
- 예측 어려운 순서: 실행 타이밍을 정확히 예측하기 어려움
- 백그라운드 처리: 사용자 경험을 방해하지 않음
⏰ 시간 맞춰 실행 (DelayQueue)
지연 방식은 이벤트를 특정 시간 후에 처리하거나, 정해진 시각에 처리하는 방식이다. 예약 발송이나 스케줄링이 필요한 경우에 사용한다.
운영체제의 타이머와 스케줄러가 이런 방식으로 동작한다. cron 작업이나 지연된 작업들을 관리하는 시스템과 비슷하다.
마치 예약 메시지를 보내거나, 알람을 설정해 두는 것과 같다. 정해진 시간이 되면 자동으로 실행된다.
특징
- 스케줄링: 미래의 특정 시점에 작업 실행
- 예약 시스템: 타이머 기반의 지연 실행
- 취소 가능: 예약된 작업을 중간에 취소할 수 있음
- 복잡한 관리: 타이머와 작업 상태 관리가 필요
🔄 하이브리드 방식
실제 시스템에서는 이 세 가지 방식을 조합해서 사용하는 경우가 많다. 이벤트의 중요도나 성격에 따라 적절한 처리 방식을 선택한다.
- UI 이벤트: 즉시 처리 (SyncQueue)
- 데이터 처리: 비동기 처리 (AsyncQueue)
- 정기 작업: 지연 처리 (DelayQueue)
🤝 Promise
Promise
는 “미래에 완료될 작업”을 나타내는 객체다. 비동기 작업이 성공할지 실패할지 모르지만, 결과가 나오면 알려주겠다는 약속이다.
운영체제의 비동기 I/O와 비슷한 개념으로, 작업을 요청하고 즉시 제어권을 돌려받은 후, 나중에 완료 통지를 받는다.
앞서 살펴본 대기큐들과의 관계를 보면, AsyncQueue나 DelayQueue에서 처리되는 각각의 비동기 작업들이 바로 Promise로 관리될 수 있다. 큐는 “언제 실행할지”를 정하고, Promise는 “그 작업의 결과를 어떻게 받을지”를 담당한다고 볼 수 있다.
Promise의 세 가지 상태:
- Pending: 작업 진행 중
- Fulfilled: 성공 완료
- Rejected: 실패
Leave a comment