Jaebi의 Binary는 호남선

Flutter - Isolate & Event Loop 본문

공부

Flutter - Isolate & Event Loop

jaebijae 2024. 6. 1. 20:06

Isolate

  • Dart - Single Threaded Language이나 async 가 가능함
  • Isolate - 모든 다트 코드들이 실행 되는 곳
    • Dart에서 비동기 작업을 가능하게 함
    • 기계 안에 있는 작은 메모리 공간, single thread가 event loop을 실행
    • Dart에서는 thread가 memory를 가진채로 isolate에 있음, 그리고 그 이벤트만 실행
    • 대부분 dart app은 single isolate에서 코드를 실행하지만 다중으로도 사용 가능
      • 계산량이 많아서 main isolate에서 프레임을 낮추는 경우:
        • 개별 isolate을 만들어서 처리 → main isolate에 부담을 주지 않으면서 위젯트리를 다시 만들고 렌더
        • 새로 생성된 isolate은 자기 고유의 event loop과 메모리를 가지게됨, main isolate에서 상속되었지만 main isolate은 접근 불가
        • 서로 작용하려면 메시지를 서로 전달하는 방식 밖에 없음 (port를 통해서)
    • Isolate 장점: (thread가 하나 밖에 없기에) memory allocation & garbage collection은 locking이 필요 없음
      • 메모리가 변형되지 않음

Event Loop

  • App의 Lifetime start & end사이에는 모든 이벤트들 → Disk I/O, User Gesture등
  • 모든 이벤트들이 어떤 순서로 일어나는지 앱에서는 예측할 수 없음, 그리고 block되지 않는 single thread로 모든걸 처리해야함
  • Event Loop → Event queue에서 하나씩 순차적으로 처리하여 queue가 비어질때 까지 게속 돌아감
    • 아무것도 하지 않고 있을때는 thread는 그냥 다음 이벤트 기다림
  • 예시:
ElevatedButton(
  child: const Text('Click Me'),
  onPressed: () {
    final myFuture = http.get(Uri.parse('https://example.com'));
    myFuture.then((response) {
      if (response.statusCode == 200) log('Success');
    });
  },
)
  • 작동 → Flutter에서 버튼 만듦 → 화면에 표시 → 기달 (Event Loop은 걍 가만히 처리할 일을 기다리고 있음)→ 버튼 탭 → 탭 이벤트가 Event queue에서 들어가 처리 시작 → Flutter가 이벤트 확인 → 렌더링 시스템이 ElevatedButton과 관련이 있음 확인 → ElevatedButton의 onPressed 실행 → onPressed는 네트워크 요청을 실행 → Future를 반환 → then을 사용하여 future를 위한 완성 핸들러 등록 → loop 완료, 이벤트 폐기
  • 특정한 이벤트를 위해 블록으로 나뉘어짐:
    • Line 1~3: 초기 위젯 생성
    • Line 4~5: 탭 이벤트
    • Line 6: 네트워크 Response 이벤트

Reference

 

'공부' 카테고리의 다른 글

Swift와 Dart 문법 차이  (0) 2024.06.12
TDD - Test Driven Development  (0) 2024.06.01
Behavioral Patterns - Template  (0) 2024.06.01
Behavioral Patterns - Adapter  (0) 2024.06.01
Structural Patterns - Adapter  (0) 2024.06.01