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을 사용할 때는 스레드 간의 통신을 위해 SendPort
와 ReceivePort
를 사용할 수 있습니다.
참고 자료