[flutter] 플러터에서의 멀티스레딩 처리 방법

Flutter는 싱글스레드 아키텍처를 기반으로 동작하는 프레임워크입니다. 하지만 애플리케이션 내에서 복잡한 작업을 수행해야 할 때 멀티스레딩을 사용하여 작업을 분산시킬 수 있습니다. 이를 통해 UI의 반응성을 유지하면서 비동기 작업을 처리할 수 있습니다.

다음은 Flutter에서 멀티스레딩을 처리하는 방법을 알아보겠습니다.

1. Isolate 사용

Flutter의 멀티스레딩 기능은 Isolate을 사용하여 구현됩니다. Isolate은 애플리케이션 내에서 독립적으로 실행되는 작업 단위입니다.

import 'dart:async';
import 'dart:isolate';

void main() async {
  ReceivePort receivePort = ReceivePort();
  
  Isolate isolate = await Isolate.spawn(backgroundTask, receivePort.sendPort);
  
  receivePort.listen((data) {
    print('Received data: $data');
  });

  print('Main thread');
}

void backgroundTask(SendPort sendPort) {
  print('Background task');
  sendPort.send('Data from background task');
}

위 예제에서는 Isolate.spawn을 사용하여 backgroundTask 함수를 백그라운드 스레드에서 실행시킵니다. SendPort를 통해 데이터를 주고받을 수 있습니다. 백그라운드 스레드에서는 sendPort.send로 데이터를 보내고, 메인 스레드에서는 receivePort를 통해 데이터를 받습니다.

2. compute 함수 사용

Flutter에는 compute 함수도 제공됩니다. 이 함수는 백그라운드에서 작업을 수행하는 데 사용됩니다. compute 함수는 입력값과 반환값을 가지는 함수를 인자로 받으며, 이 함수를 백그라운드에서 실행시킵니다.

import 'package:flutter/foundation.dart';

void main() {
  compute(backgroundTask, 'Data from main').then((result) {
    print('Received result: $result');
  });

  print('Main thread');
}

String backgroundTask(String data) {
  print('Background task');
  return 'Processed data: $data';
}

compute 함수를 사용하여 백그라운드에서 실행할 함수와 입력값을 지정할 수 있습니다. 애플리케이션의 메인 스레드에서는 then 메소드를 이용하여 결과값을 받아올 수 있습니다.

결론

Flutter에서 멀티스레딩을 사용하면 애플리케이션의 반응성을 유지하면서 비동기 작업을 효율적으로 처리할 수 있습니다. Isolate을 사용하는 방법과 compute 함수를 이용하는 방법을 활용하여 멀티스레딩 처리를 구현할 수 있습니다. 추가로, Isolate을 사용할 때는 스레드 간의 통신을 위해 SendPortReceivePort를 사용할 수 있습니다.


참고 자료