본문 바로가기

Flutter

[Flutter] 플러터에서 Isolate & 비동기

먼저 플러터에서 isolate와 비동기를 비교해서 알아야 할 필요가 있다. Isolate는 이벤트의 병렬 처리를 가능하게 해주는 아이이고 비동기 프로그래밍은 요청한 작업에 따라 순서가 지켜지지 않고 이벤트가 처리될 수 있게 하는 방법이다.

♒ Isolate

  • Dart → 단일 스레드 기반
    • 정확히는 main isolate 위에서 돌아감 (not thread)
  • Isolate → 스레드를 감싸는 wrapper
    • 각자의 메모리 힙을 가짐
    • 메모리를 공유하지 않음
    • isolate 간의 커뮤니케이션은 메시지 패싱을 통해 이루어짐
    • isolate 위에서도 비동기적 프로그래밍 가능 (기본적으로 모든 코드가 main isolate 위에 있기 때문에 당연하다고 볼 수 있지만)
  • life cycle
    • dart 코드가 실행되면서 시작
    • optionally, dart 코드가 종료된 후에도 이벤트가 처리되어야 하는 경우에 유지
    • 이벤트 처리가 끝난 후 종료
  • 이벤트 처리
    • 클라이언트 앱에서 리페인트 요청, 클릭된 알림 또는 기타 UI 이벤트
    • FIFO(First In First Out) 순서로 큐에 있는 이벤트 처리
    • 큰 JSON 파일을 파싱하는 것처럼 긴 시간을 소요하는 계산 때문에 UI가 반응하지 않는다면, 해당 계산을 워커 isolate로 옮기는 선택지가 있으며 일반적으로 이러한 isolate를 백그라운드 워커라고 함

⏯️ async

  • 단일 스레드 위에서 작동
  • blocking 없이 다른 작업을 대기
  • 동시에 여러가지 작업을 수행해야하기 때문에 메서드의 동기, 비동기 여부는 중요
  • Flutter
    • Future / Stream
      • 미래 특정 시점에 이용 가능한 잠재적인(아직 확정되지 않은) 값이나 오류를 표현할 때 쓰이는 객체
      • Future은 일회성 데이터일 때
      • Stream은 일부 데이터를 여러번 가져올 때
    • async / await

 

🚀 Future

💡 async & await는 Future을 더 쉽게 다루기 위한 키워드이다.
1. await를 활용한 함수는 무조건 async 함수여야 한다.
2. async 함수는 무조건 Future를 반환해야 한다.

  • ex) Future<int>
  • 비동기 함수를 실행할 때 await 키워드를 사용해주면 되는데, 코드를 작성한 순서대로 코드가 실행되며 비동기적으로 코딩을 할 수 있다
  • Future은 한번만 값을 반환하고 완료함 (앨범에서 이미지 가져오기, 배터리 표시, 파일 가져오기, http요청등 일회성 응답에 사용)
  • List나 Set처럼 제너릭으로 미래에 어떤 값을 받아올 지 결정
  • FutureBuilder
    • 특정 Future 객체를 모니터하고, 이 Future가 완료될 때마다 UI를 업데이트할 수 있게 해주는 Flutter 위젯
    • required properties : builder (Future의 상태에 따라 UI를 빌드하는 함수를 정의합니다)
    • future (모니터링하고자 하는 Future 객체를 지정합니다)

🚅 Stream

💡 async* & await
  • ex) Stream<int>
  • 지속적으로 값을 반환 받을 때 사용
  • 한번 리슨하면 stream에 주입되는 모든 값을 지속적으로 받아옴
  • stream을 사용하려면 dart:async 패키지에서 제공하는 StreamController를 listen() 해야 함
    • 한번만 listen 가능
    • 여러번 하려는 경우 브로드캐스팅 스트림을 사용해야 함
  • stream을 반환하는 합수는 async*로 선언해야 함
  • return 대신 yield 키워드로 값을 반환해야 함
  • 지도에서처럼 위치를 지속적으로 받아오는 경우 등에 사용
  • StreamBuilder
    • 특정 Stream을 모니터하고, 스트림에서 새로운 데이터 이벤트가 발생할 때마다 UI를 업데이트할 수 있게 해주는 Flutter 위젯
    • required properties : builder (Stream의 상태에 따라 UI를 빌드하는 함수를 정의합니다)
    • stream (모니터링하고자 하는 Stream 객체를 지정합니다)

 

참고자료

https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC

 

👩‍💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹

동기/비동기 & 블로킹/논블록킹 프로그래밍에서 웹 서버 혹은 입출력(I/O)을 다루다 보면 동기/비동기 & 블로킹/논블로킹 이러한 용어들을 접해본 경험이 한번 쯤은 있을 것이다. 대부분 사람들은

inpa.tistory.com

https://dart-ko.dev/language/async

 

비동기 지원

Dart 언어를 사용한 비동기 코드 작성법을 알려드립니다.

dart-ko.dev

https://www.youtube.com/watch?v=5AxWC49ZMzs