플러터 Future, async, await

황희윤·2022년 7월 9일
0
post-custom-banner

이벤트 루프

플러터는 다트로 만들어졌고, 다트는 단일 스레드 언어다. 즉, 플러터 앱은 한번에 한 가지 일만 할 수 있다.

이벤트 루프는 백그라운드에서 무한히 도는 루프로, 주기적으로 이벤트 큐에 들러 실행해야 할 작업이 있는지 확인한다. 실행할 작업이 있고 CPU가 아무 일도 하지 않고 있다면, 해당 작업을 실행 스택에 넣는다.

작업을 기다리고 있는 메인 스레드를 가로막을 가능성이 있는 명령이 있으면 명령을 시작한 뒤 "대기할" 부분을 별도의 큐에 넣는다.

CPU의 처리 속도와 상관없이 느린 작업이 있는데, 대표적인게 파일에서 읽는 작업과 HTTP 통신이다.

느린 작업을 하는 과정

  1. 느린 작업을 정상적으로 시작한다.
  2. 디스크, HTTP 요청 등을 대기하기 시작하는 순간 CPU에서 분리한다.
  3. 일종의 리스너를 만든다. 이 리스너는 작업을 지켜보다가 작업이 끝나면 알려준다.
  4. 리스너의 참조는 메인 스레드로 리턴되는데, 이 참조 객체가 Future다.
  5. 메인 스레드는 계속해서 자신의 길을 간다.
  6. 결국 대기 중이던 작업이 끝나면 이벤트 루프가 확인한 뒤 메인 스레드에서 관련 메서드 즉 콜백 함수를 실행해서 느린 이벤트를 마무리한다.

.then 함수

데이터 준비가 완료되면 Future을 사용할 수 있는데, then 함수를 통해 콜백 함수를 등록하고 콜백 함수가 Future 데이터를 처리한다.

async, await

then 함수와 비슷하게 await을 사용하면 데이터를 기다렸다가 받을 수 있다.
await을 사용하면 실행 중인 코드를 잠시 멈추고 다음 행으로 넘어가기 전에 Future의 완료를 기다린다.
함수 안에서 await를 사용하면 함수가 메인 스레드를 가로막을 위험이 있기 때문에 항상 함수를 async로 표기해서 비동기적으로 실행해야 한다.

async는 플러터의 build 메서드에는 사용할 수 없지만, onPress 같은 이벤트에는 사용할 수 있다. 따라서 비동기적인 작업은 이벤트로 돌리려고 노력해야 한다.

profile
HeeYun's programming study
post-custom-banner

0개의 댓글