Dart 의 Event Loop 이란 무엇인가?
프로그램 수행중에 mouse click, file I/O 완료 등과 같은 다양한 이벤트가 비동기적으로 일어나는데, Dart 에선 이를 적절히 처리하기 위해 각 isolate 별로 event loop 를 유지한다.
어플리케이션이 실행되면 event loop 에선 매번 루프를 돌며 evenet queue 에 새롭게 쌓인 이벤트를 처리한다. 위 이미지에선 event loop 가 event queue 에서만 이벤트를 꺼내오만, event queue 외에도 microtask queue 가 존재하며, event loop 에서는 microtask 를 event 보다 우선적으로 처리한다. (이벤트 큐가 쌓여있을 때 새롭게 microtask 가 들어오면, 다시 microtask 부터 수행한다)
만약 더이상 처리할 태스크가 없다면 앱은 종료되게 된다.
왜 태스크를 microtask 와 event 로 구분할까?
이유는 작업을 우선적으로 처리해야 하는 경우와, 작업 순서 보장이 필요한 경우가 존재하기 때문이다. 동작부터 설명하면 다음과 같다.
import 'dart:async';
void main() {
scheduleMicrotask(() => print('Microtask 1'));
Future.delayed(Duration(seconds: 1), () => print('Delayed event'));
scheduleMicrotask(() => print('Microtask 2'));
print('Normal execution');
}
Future 을 활용할 경우에는 태스크가 자동으로 event queue 에 추가된다. microtask queue 에 작업을 추가하고 싶다면 scheduleMicroTask() 를 사용하면 된다.
이에 대한 출력은 다음과 같다.
Normal execution
Microtask 1
Microtask 2
Delayed event
isolate 는 우선 수행중이던 명령어는 모두 수행한 후, event loop 에서 등록된 작업들을 처리하기 시작하는데, microtask 부터 수행된 후에 event 들이 처리되는 것을 확인할 수 있다.
위 main 함수에서 Future.delayed 함수에 Duration seconds 를 0으로 바꾸면 어떻게 될까? 출력 순서가 바뀔까? 정답은 그렇지 않다. seconds 가 0이기 때문에 바로 수행될 것 같지만, 이는 타이머에 의하여 event queue 에 등록되고, 추후에 event loop 가 수행될 때 처리되게 된다.
또한, 위 예시에서 main 함수가 사실상 event loop 에 등록되는 최초의 task 라고 볼 수 있다.
언제 microtask 가 쓰이는가?
flutter 에서 상태를 변화 시킨 후 widget 에 대한 rebuild 가 필요할 때 자주 사용하게 되는 setState() 함수를 예로 들 수 있다. 이는 내부적으로 microtask 를 생성하여 rebuild 태스크를 스케쥴링 한다.
I/O 작업 완료처리나 유저 화면 터치와 같은 작업들이 event queue 에 등록되어 있더라도, rebuild 가 먼저 수행되게 된다.
즉, 우선순위를 rebuild 에 두었다고 볼 수 있다.
'Flutter' 카테고리의 다른 글
Flutter User Input & Animation (0) | 2023.05.19 |
---|---|
Flutter Widgets (0) | 2023.05.18 |
How Flutter Renders Widgets (0) | 2023.05.16 |
[Dart] Isolates & Runtime + how Flutter work with it (0) | 2023.05.14 |