대규모 처리 작업을 위해 백그라운드 작업 처리를 해야 할 일이 생겼다.
간단히 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를 아예 종료시켜버릴 수 있게되었다.
| 특징 | compute | Isolate.spawn |
|---|---|---|
| 사용 용도 | 단순하고 짧은 작업 | 복잡하거나 장기 실행 작업 |
| Isolate 관리 | Flutter가 자동 관리 | 사용자가 직접 관리 |
| 데이터 직렬화 | 필수 | 필수 아님 |
| 유지 비용 | 상대적으로 적음 | 상대적으로 높음 |
| 구현 난이도 | 쉬움 | 어려움 |
| 동작 범위 | 특정 작업에 제한 | 다양한 작업 처리 가능 |
간단히 compute와 Isolate.spawn을 비교한 표이다. 간단하게 백그라운드 작업을 할 것이라면 compute를 사용하겠지만 그것이 아니라 복잡한 작업 또는 세세하게 본인이 컨트롤하고 싶다면 Isolate.spawn을 사용하여야겠다.