예제로 알아보는 Event Loop(Concurrency)
- 다트의 동시성(Concurrency)은 이벤트 루프를 통해 구현되며, 비동기 함수의 스케줄링 및 실행 순서를 이해하는 데 핵심적인 역할을 합니다. 🔄
Future.value와 같이 즉시 완료되는 비동기 작업이나 await 이후의 코드는 마이크로태스크 큐(Microtask Queue)로 들어가며, 이는 일반 이벤트 큐(Event Queue)보다 높은 우선순위를 가집니다. ⚡
- 동기 함수는 메인 아이솔레이터에서 즉시 실행되고,
Future 생성자나 I/O 작업과 같은 일반적인 비동기 작업은 이벤트 큐에 스케줄링됩니다. 🚀
- 첫 번째 예제에서
Task 1(동기), Task 3(동기), Task 2(마이크로태스크 큐) 순서로 실행되어, 마이크로태스크 큐가 동기 작업 직후에 처리됨을 보여줍니다. 🔢
await 키워드는 해당 비동기 함수의 실행을 일시 중지시키고, 기다리던 Future가 완료되면 await 이후의 모든 코드를 마이크로태스크 큐로 옮겨 연속적으로 실행되게 합니다. ⏸️
- HTTP 요청과 같은 실제 비동기 네트워크 작업은 이벤트 큐에 들어가며, 응답이 도착하여
Future가 완료되면 .then 콜백이 마이크로태스크 큐로 이동하여 처리됩니다. 🌐
- 이벤트 루프의 복잡한 동작을 완벽하게 예측할 필요는 없지만, 그 존재와 대략적인 스케줄링 순서를 이해하는 것은 미세한 실행 순서 제어가 필요할 때 중요합니다. 🤔
- 마이크로태스크 큐는 이벤트 큐보다 먼저 비워지므로,
await 이후의 작업이나 Future.value는 다음 이벤트 큐 작업보다 먼저 실행됩니다. ➡️