본문 바로가기

Personal Posting/Flutter

Dart의 Event Loop 정리

 

Dart에서 Event Loop는 비동기 프로그래밍의 핵심 개념으로, 프로그램이 여러 작업을 효율적으로 처리할 수 있도록 관리한다. 특히 Flutter 개발자라면 UI 업데이트, 사용자 입력 처리, 파일 I/O 등 다양한 비동기 작업을 이해하기 위해 Event Loop의 작동 방식을 이해하는 것이 중요하다. 이번 블로그에서는 이벤트 루프의 주요 개념과 작동 원리를 정리하기로 한다.

 

1. Event Loop란?

Event Loop는 프로그램에서 발생하는 다양한 이벤트(예: I/O 작업, 사용자 입력 등)를 관리하고 처리하는 구조 또는 디자인 패턴을 말한다. Dart는 단일 스레드(single-threaded) 언어로 설계되었기 때문에, Event Loop를 통해 비동기 작업을 효율적으로 처리한다.

  • 비동기 코드: Dart는 비동기 작업이 많으며, 이를 처리하기 위해 FutureStream 같은 객체를 사용한다.
  • 역할: Event Loop는 작업을 순서대로 실행하며, 블로킹 없이 여러 작업을 동시에 처리할 수 있도록 돕는다.

 

2. Dart의 Event Queue와 Microtask Queue

Dart의 Event Loop는 두 가지 큐를 사용하여 작업을 관리한다.

 

1) Event Queue

  • 외부 이벤트(I/O 작업, 타이머, 사용자 입력 등)를 처리한다.
  • 예) 파일 읽기/쓰기, 네트워크 요청, 타이머 만료

2) Microtask Queue

  • 내부적으로 짧은 비동기 작업을 처리하는데 사용된다.
  • 모든 Microtask가 완료된 후에 Event Queue 작업이 실행된다.
  • 예) scheduleMicrotask()로 예약된 작업

 

3. Event Loop의 작동 방식

Event Loop는 다음 순서로 작동한다.

1) App 시작:
 - main() 함수가 호출되고 동기적으로 실행

2) Microtask Queue 확인:
 - Microtask Queue에 작업이 있으면 FIFO 순서로 실행한다.

3) Event Queue 확인:
 - Microtask Queue가 비어있으면 Event Queue에 작업을 가져와 실행한다.

4) 반복:
 - Microtask → Event 순서로 계속 반복하며 Queue가 비어있을때까지 실행한다.

 

4. 코드 예제와 출력 흐름

import 'dart:async';

void main() {
  print('A');

  Future(() => print('B')); // Event Queue에 추가
  scheduleMicrotask(() => print('C')); // Microtask Queue에 추가

  Future(() => print('D')); // Event Queue에 추가
  scheduleMicrotask(() => print('E')); // Microtask Queue에 추가

  print('F');
}

 

** 출력결과 **

A
F
C
E
B
D

 

  1. main() 함수는 동기적으로 실행되므로 먼저 A와 F가 출력된다.
  2. Microtask Queue(C, E)가 먼저 실행된다.
  3. 이후 Event Queue(B, D)가 실행된다.

 

5. 주요 개념 요약

  • Dart는 단일 쓰레드 언어지만 비동기 프로그래밍을 지원하기 위해 Event Loop를 사용한다.
  • Microtask Queue는 언제나 Event Queue보다 우선순위가 높다.
  • 비동기 작업(Future)은 기본적으로 Event Queue에 추가되며, scheduleMicrotask()를 사용하면 Microtask Queue에 추가할 수 있다.

 

6. 활용

 

1) Task 스케쥴링

Dart에서는 특정 작업을 예약하거나 우선순위를 설정하기 위해 다음 API를 사용할 수 있다.

  • Future: 기본적으로 Event Queue에 작업 추가
  • scheduleMicrotask(): Microtask Queue에 작업 추가
void main() {
  Future(() => print('Event Task'));
  scheduleMicrotask(() => print('Microtask'));
}
** 출력 결과 **

Microtask
Event Task

 

2) UI 업데이트와 비동기 코드

Flutter 앱에서는 UI 업데이트 중 무거운 연산이나 I/O 작업이 있다면, 이를 적절히 분리하여 UI가 멈추지 않도록 해야한다. 이 때 Future와 Microtask를 활용하면 효율적인 작업 처리가 가능하다.

 

정리

  • Dart는 단일 스레드 기반으로 동작하며, 모든 비동기 처리는 Event Loop를 통해 관리한다.
  • Microtask Queue는 항상 우선순위가 높으며, 짧고 빠르게 처리해야 할 내부 작업에 적합하다.
  • Future와 scheduleMicrotask를 적절히 활용하여 원하는 순서대로 작업을 처리할 수 있다.

 

 

 

아래 링크의 포스팅을 참고하여 정리한 내용입니다. 원문을 확인하고 싶으시면 아래 링크를 확인해주세요.

출처 - https://flutterexperts.com/event-loop-in-dart