플러터의 isolate

나고수·2025년 2월 21일
0

Flutter

목록 보기
7/8
post-thumbnail

플러터의 isolate

정의와 특징

  • 독립적인 메모리와 이벤트루프를 가지는 작업단위
  • 메시지 패싱을 통해 데이터를 주고 받는다. 이 과정에서 역/직렬화가 일어나기 때문에 복잡한 데이터 보다는 간단한 데이터를 주고받는 것이 좋다.
  • 독립적인 메모리 → isolate를 많이 생성할 시 메모리 낭비 문제를 고려해야함
  • 이벤트 루프 → 이벤트큐와 마이크로큐를 통해 작업을 처리한다.

필요 이유

플러터는 싱글스레드로 실행된다.

하지만 IO작업, CPU바운드 작업을 할 때 싱글스레드(메인스레드)에서 작업하면 jank가 발생한다.

왜냐면, 플러터는 60프레임을 1초에 띄우는 것을 목표로하는데(16.7ms마다 프레임 교체가 일어나야함) 다른 무거운 작업이 진행중이면 프레임 교체 시 버벅거리는 현상이 발생하기 때문이다.

UI업데이트에 영향을 끼치지 않으면서 무거운 작업을 하기 위해서 별도의 isolate가 필요하다.

기본 isolate에서도 대부분의 작업을 문제없이 실행할 수 있다.

하지만 CPU바운드 작업(대용량 이미지 처리, 복잡한 역/직렬화 등) 등 작업이 끝날때 까지 스레드를 블로킹 하는 작업을 하게될 때 별도의 isolate가 필요하다.

사용방법

  1. spawn - 사용자가 직접 isolate를 생성, 해제 및 관리 & 메시지 패싱을 통해 사용자가 결과값 전달 해야함
  2. compute - 시스템이 isolate를 생성, 해제 및 관리 & 시스템이 결과값을 알아서 메인 스레드에 반환함

isolate와 비동기 작업

  • isolate가 여러개 있으면 여러 작업을 병렬적으로 실행 하는 것이다.
  • isolate 내부에는 독립적인 이벤트루프가 있는데 이것을 활용해 하나의 isolate 내에서 비동기(동시적인)작업을 처리하는 것이다.
    • 이벤트루프는 이벤트큐(일반적인 작업이 적재)와 마이크로큐(우선순위가 높은 작업이 적재)로 구성되어 있다.
    • 비동기 작업이 수행 되는 동안 이벤트루프는 다른 작업을 수행할 수 있고, 비동기 작업이 완료되면 콜백이 이벤트 큐에 다시 들어가게 되고 이 콜백이 이벤트루프에 의해 실행되면 비동기 작업의 결과값을 반환 받을 수 있다.
    • 콜백이 이벤트루프에 들어가는 방식은 두가지이다.
    • await-async 작업이 완료되면 콜백이 마이크로큐에 들어가게 된다. 따라서 비동기 작업 완료 시 콜백이 즉시 실행된다.
      void main() async{
      	print('시작');
      	await Future.delayed(Duration(seconds:1)).then((_) => print('완료'));
      }
    • Timer이나 Future.delayed 같은 함수를 사용하거나 await없이 async만을 사용하면 콜백이 이벤트큐에 들어가게된다. 따라서 비동기 작업 완료 시 콜백이 즉시 실행되지 않고 본인 순서가 찾아오면(동기작업 완료→마이크로큐 비워짐→이벤트큐의 이전 작업 완료) 실행된다.
      void main(){
      	print('시작');
      	Future.delayed(Duration(seconds:1)).then((_) => print('완료'));
      }
profile
되고싶다

0개의 댓글