Future는 어떻게 실행될까? Dart 비동기(Event Loop)의 모든 것
- 다트의 이벤트 루프는 메인 아이솔레이터로 보낼 여러 비동기 태스크를 스케줄링하는 핵심 역할을 합니다. 🔄
- 메인 아이솔레이터는 모든 태스크가 실제로 실행되는 '두뇌'와 같은 공간입니다. 🧠
- 태스크는 우선순위에 따라 마이크로태스크 큐와 이벤트 큐로 나뉘어 관리됩니다. 📊
- 동기(Synchronous) 코드는 가장 높은 우선순위로 메인 아이솔레이터에서 즉시 실행됩니다. ⚡
- 비동기(Asynchronous) 코드는 큐에 들어가며, 마이크로태스크 큐가 이벤트 큐보다 높은 우선순위를 가집니다. 🚀
- 이벤트 루프는 동기 코드 실행 후 마이크로태스크 큐의 모든 작업을 처리하고, 그 다음 이벤트 큐의 작업을 하나씩 처리합니다. 🎯
- 이벤트 큐의 작업이 하나 완료될 때마다 이벤트 루프는 마이크로태스크 큐를 다시 확인하여 새로운 작업이 있는지 점검하고, 있다면 먼저 처리합니다. 🔁
Future.value와 같은 즉시 완료되는 퓨처의 연산 콜백, 그리고 then(), catchError() 같은 퓨처 완료 후 즉시 실행되는 콜백은 마이크로태스크 큐에 할당됩니다. ✅
scheduleMicrotask() 또는 Future.microtask를 사용하여 개발자가 명시적으로 마이크로태스크 큐에 작업을 할당할 수 있습니다. ✍️
- 타이머, I/O 작업, 사용자 이벤트(클릭 등), 그리고 일반적인
Future 객체의 연산 콜백은 이벤트 큐에 할당됩니다. ⏳
await 키워드를 사용하면, 해당 퓨처의 연산은 이벤트 큐에 들어가고, await 이후의 코드는 마이크로태스크 큐에서 처리됩니다. 🚦