본문 바로가기
Flutter

[Dart] 비동기 프로그래밍 (Isolates, Event Loops, Future)

by 퍼즐잎 2020. 1. 23.

Flutter 유튜브 채널에 친절하게도 한글 자막이 달려있는 영상이 있다.

그중에서도 비동기 프로그래밍에 관한 영상이다.

https://www.youtube.com/watch?v=vl_AaCgudcY

 

Isolates

모든 Dart 코드가 실행되는 곳으로, 단일 스레드가 이벤트 루프를 실행하고 있다.

단일 스레드 안에 여러 개의 Isolate가 있는 형태로 보면 될 것 같다.

(C++과 같은 다른 언어에서는 같은 메모리를 공유하는 다중 스레드를 가질 수 있다.)

 

Dart에서는 스레드가 메모리를 가진 채로 Isolate에 있으며 이벤트만 처리하고 있다.

main Isolate가 기본이 되는 Isolate이며 Dart의 런타임에 의해 만들어진다.

main isolate에서 실행해야 할 계산이 너무 많아서 프레임을 낮추는 경우에 Isolate를 생성하여 처리할 수 있다.

개별 Isolate를 만들고 계산을 처리하기 때문에 main isolate에 부담을 주지 않으면서 다른 작업들을 처리할 수 있다.

새로 추가된 Isolate

새로운 Isolate는 고유 이벤트 루프를 가지게 된다.

(Isolate는 분리된 작업 단위로, 각각의 메모리 힙을 가지고 있다.)

 

두 개의 Isolate를 함께 작동시키는 방법은 두 Isolate가 메시지를 전달하면서 처리를 하는 방식으로 가능하다.

Isolate에서 메모리 할당이나 가비지 컬렉션은 잠금(Lock)을 필요로 하지 않는다.

 

Event Loops

메모리 이벤트, 사용자 입력 이벤트 등 많은 이벤트들이 발생할 수 있다.

그러나 이러한 이벤트들이 언제 어떤 순서로 일어나게 될지 앱에서는 알 수가 없다.

 

이러한 이벤트들을 단일 스레드로 모두 처리하기 위해서 이벤트 루프를 사용한다.

이벤트 큐(Queue)에서 가장 오래된 이벤트부터 순서대로 하나씩 이벤트를 처리하는 방식이다.

이벤트가 없을 때는 스레드는 가만히 다음 이벤트를 대기한다.

 

Future

Future는 데이터를 위한 작은 선물상자로 볼 수 있다. 닫힌 상태로 건네주고(Uncompleted) 시간이 지나면 열리게 된다.

상자가 열리면 안에는 값이 들어있거나 에러가 들어있다.

Future의 상태

Future의 장점은 이벤트 루프를 사용하여 API를 쉽게 만들 수 있다는 것이다.

버튼을 클릭하는 경우 이미지를 다운로드하고, 다운로드한 이미지를 보여주는 예제이다.

이벤트 루프에서 위 기능이 동작하는 순서는 다음과 같다.

 

1. 유저의 터치 동작이 발생한다.

2. 이벤트 루프가 터치 동작을 받고, 핸들러(onPressed)가 이벤트를 처리한다.

3. http 라이브러리를 이용하여 이미지를 요청한다.

4. myFuture의 상자를 열고 값을 확인하기 위해서 then을 사용하여 콜백 이벤트를 등록한다.

5. 이벤트 루프에서는 이미지 결과가 들어오기를 기다리거나, 다른 이벤트들을 처리한다.

6. http.get 요청의 응답이 도착하면 Future에 담고 myFuture로 전달한다.

7. myFuture에 등록된 콜백 이벤트를 실행한다.

8. 이미지가 나타난다.

 

댓글