[Flutter] Compute와 Spawn

zunu·2025년 1월 21일

대규모 처리 작업을 위해 백그라운드 작업 처리를 해야 할 일이 생겼다.
간단히 Compute를 사용하면 된다길래 compute를 사용했다.

compute는 내부적으로 Isolate를 생성하고 자동으로 실행한 뒤 자동으로 Isolate를 처리해주는 사실상 멀티 스레딩 자동 함수였다.

하지만 문제점이 생겼다.
compute를 사용하여 백그라운드 작업 처리를 했는데 이 작업을 취소할 일이 생겼다. 하지만 compute를 사용하면 Isolate를 내부적으로 "알아서" 처리하기 때문에 중간에 내가 Isolate에 간섭할 수가 없었다.

그래서 찾은 것이 바로 Isolate.spawn이다.

간단히 말해서 compute와는 달리 내부적으로 Isolate를 생성하고 처리하는 것이 아닌, 모든 것을 직접 관리하여야 했다.

이로써 내가 원하는 Isolate에 간섭하여 작업을 취소할 수 있는 것은 물론, 하나의 Isolate에 여러 작업을 처리하도록 할 수도 있고 작업의 생명주기를 내가 직접 관리할 수 있게 되었다.

Isolate.spawn의 사용 예시는 아래와 같다.

import 'dart:isolate';

void isolateTask(SendPort sendPort) {
  int result = 42; // 작업 수행
  sendPort.send(result);
}

void isolateCancel(Isolate isolate) {
	isolate.kill();
}

Future<void> main() async {
  ReceivePort receivePort = ReceivePort();
  Isolate? _isolate = await Isolate.spawn(isolateTask, receivePort.sendPort);

  receivePort.listen((message) {
    print('Received: $message'); // 출력: Received: 42
    receivePort.close();
  });
}

spawn을 통해 다중 스레드로 작업을 실행해주고 kill을 통해 isolate를 아예 종료시켜버릴 수 있게되었다.

특징computeIsolate.spawn
사용 용도단순하고 짧은 작업복잡하거나 장기 실행 작업
Isolate 관리Flutter가 자동 관리사용자가 직접 관리
데이터 직렬화필수필수 아님
유지 비용상대적으로 적음상대적으로 높음
구현 난이도쉬움어려움
동작 범위특정 작업에 제한다양한 작업 처리 가능

간단히 compute와 Isolate.spawn을 비교한 표이다. 간단하게 백그라운드 작업을 할 것이라면 compute를 사용하겠지만 그것이 아니라 복잡한 작업 또는 세세하게 본인이 컨트롤하고 싶다면 Isolate.spawn을 사용하여야겠다.

profile
개발새발

0개의 댓글