Flutter

[Flutter] Isolate 사용하기

devyong 2025. 3. 27. 19:06

Flutter는 기본적으로 단일 스레드에서 실행되며, 무거운 작업을 수행하면 UI가 멈추는 현상이 발생할 수 있다. 이를 해결하기 위해 Flutter는 Isolate라는 개념을 제공한다.

 

Isolate는 Dart에서 제공하는 독립적인 실행 환경으로, 메모리를 공유하지 않는 별도의 스레드입니다. 따라서 멀티스레딩이 필요한 무거운 연산(예: 이미지 처리, JSON 파싱, 암호화 연산 등)에 적합하다.

 

Isolate 사용법으로 2개를 준비봤다.

compute()와  Isolate.spawn()이며 기능에 따라 사용을 권장한다.

 

compute()를 사용한 간단한 Isolate 실행

import 'package:flutter/foundation.dart';

void main() async {
  var result = await compute(heavyTask, 100000000);
  print('결과: $result');
}

int heavyTask(int value) {
  int sum = 0;
  for (int i = 0; i < value; i++) {
    sum += i;
  }
  return sum;
}

 

* 새로운 Isolate에서 실행

* 작업이 끝나면 자동으로 종료됨 (따로 dispose() 필요없음)

compute()는 클래스의 메소드를 실행할 수 없음 (최상위 함수 또는 static 함수여야함)

지속적인 데이터 처리는 어렵고, 1회성 연산에 적합함

 

Isolate.spawn()을 사용한 커스텀 Isolate 실행

import 'dart:isolate';

void main() async {
  ReceivePort receivePort = ReceivePort();
  Isolate isolate = await Isolate.spawn(workerIsolate, receivePort.sendPort);

  receivePort.listen((message) {
    print('메인 Isolate에서 받은 데이터: $message');
    if (message == '완료') {
      receivePort.close();
      isolate.kill(priority: Isolate.immediate);
    }
  });
}

void workerIsolate(SendPort sendPort) {
  for (int i = 0; i < 5; i++) {
    sendPort.send('작업 중... ($i)');
  }
  sendPort.send('완료');
}

 

* SendPort와 ReceivePort를 사용해 지속적인 데이터 교환 가능

* 장기 실행되는 백그라운드 작업에 적합

* compute()보다 직접적인 관리가 필요

* isolate.kill()을 사용해 수동으로 종료해야함

 

 

결론을 말하자면, 단순한 일회성 연산은 compute() 를 사용하는것이 좋아보인다.

지속적인 데이터 처리 및 백그라운드 작업이 필요하다면 Isolate.spawn()을 사용할 것이다.

Isolate를 사용하면 성능을 최적화하여 쾌적한 앱을 만들 수 있을 것 같다