[Flutter] isolate 간단한 설명

Flutter의 Isolate는 Dart 언어의 멀티스레딩 구현하는 기능입니다. Isolate는 기본적으로 별도의 메모리 힙을 가진 독립적인 실행 스레드로, Flutter 애플리케이션에서 병렬 처리를 가능하게 합니다. 각 Isolate는 다른 Isolate와 직접적으로 메모리를 공유하지 않기 때문에, 통신을 위해서는 메시지 전달 방식을 사용합니다.

Isolate의 주요 특징은 다음과 같습니다:

  • 메모리 분리: 각 Isolate는 자신만의 메모리 공간과 상태를 가집니다. 이는 메모리 충돌을 방지하고, 애플리케이션의 안정성을 높입니다.
  • 메시지 전달 시스템: Isolate 간에 데이터를 공유하려면, 메시지 전달을 통해 이루어집니다. 이 메시지는 직렬화될 수 있어야 하며, 이는 데이터를 안전하게 전송하고, Isolate 간의 독립성을 유지하는 데 도움이 됩니다.
  • 병렬 처리: Isolate를 사용하면, CPU 집약적 작업이나 네트워크 요청과 같은 작업을 메인 UI 스레드에서 분리할 수 있어, 애플리케이션의 반응성을 향상시킬 수 있습니다.
  • 사용 용도: Isolate는 주로 백그라운드에서 데이터 처리, 이미지 처리, JSON 파싱, 데이터베이스 작업 등을 수행하는 데 사용됩니다. 이를 통해 메인 스레드가 UI 작업에 집중할 수 있게 하여 사용자 경험을 향상시킵니다.

Flutter에서 Isolate를 사용하면, 동시성과 병렬 처리의 이점을 얻으면서도, 메인 스레드의 부하를 줄여 애플리케이션의 성능을 향상시킬 수 있습니다. 그러나, Isolate 간의 통신과 데이터 관리는 복잡할 수 있으므로, 필요한 경우에만 사용하는 것이 좋습니다.

다음은 isolate를 사용하는 간단한 예제입니다.

import 'dart:isolate';

void main() {
  runApp(MyApp());
}

// 메인 앱 위젯
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Isolate Demo',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _message = 'Result will be displayed here';


  // 백그라운드에서 실행될 작업
  static void _backgroundWork(SendPort sendPort) {
    // 복잡한 계산 또는 작업을 수행
    String result = "Background work completed";
    // 계산 결과를 메인 스레드로 전달
    sendPort.send(result);
  }

  // 백그라운드 작업을 실행하는 함수
  void _startBackgroundTask() async {

    ReceivePort receivePort = ReceivePort();

// 백그라운드 작업으로부터 메시지를 받습니다.
    receivePort.listen((data) {
      setState(() {
        _message = data;
      });
    });

    Isolate.spawn(_backgroundWork, receivePort.sendPort);

    
  }



  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Isolate Demo'),
      ),
      body: Center(
        child: Text(_message),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _startBackgroundTask,
        tooltip: 'Start',
        child: Icon(Icons.play_arrow),
      ),
    );
  }
}

이 코드에서 Isolate.spawn 함수를 사용하여 새로운 Isolate에서 _backgroundWork 함수를 실행합니다. 이 함수는 복잡한 계산이나 데이터 처리를 담당할 수 있습니다. 계산이 완료되면, 결과를 메인 스레드로 전달하기 위해 SendPort를 사용합니다.

메인 스레드에서는 ReceivePort를 사용하여 백그라운드 Isolate로부터 데이터를 수신하고, UI를 업데이트합니다.

이 예제는 Flutter에서 Isolate를 사용하여 백그라운드 작업을 수행하고, 그 결과를 메인 스레드와 통신하는 기본적인 방법을 보여줍니다. 실제 애플리케이션에서는 더 복잡한 데이터 처리와 상태 관리가 필요할 수 있습니다.