-
Flutter - Thread, Future, async 심화Flutter 2021. 10. 9. 02:11반응형
[Thread]
- 프로세스 내에서 실행되는 흐름의 단위
- Dart는 싱글 스레드로 운영되는 언어이다. 싱글 스레드로 동작 한다는 뜻은 오직 한번에 하나의 작업만 실행되고, 이 작업이 실행되는 동안 코드상에 존재하는 다른 작업들이 개입할 수 없다.
- Dart는 이런 싱글스레드의 단점을 Event loop로 해결한다. Dart는 스레드가 생성된 순간 3가지 작업을 하게 된다.
-> 선입 선출 방식으로 Micro Task(이벤트 큐로 넘어가기 전에, 아주 짧은 시간동안 비동기적으로 먼저 실행되고 끝 나는 작은 작업)와 Evnet 준비
-> main 함수 실행
-> Evnet loop 실행
[Evnet loop]
- 외부에서 전달되는 이벤트가 발생했을 때 이벤트과 관련된 코드들이 이벤트 큐에 등록이 된다.
- Future와 Stream도 이 이때 이벤트 큐에 등록이 되고 Evnet loop를 통해서 처리된다.
[Future]
- 비동기 방식으로 미래에 어느 시점에 완성이 되어서 실제적인 데이터가 되거나 에러를 반환하는 객체이다.
- 코드상에서 새로운 Future를 객체화 시키면 다음 과정을 거친다.
1. 다트에 의해서 future 객체가 내부적인 배열에 등록
2. Future관련해서 실행되어야 하는 코드들이 이벤트 큐에 등록
3. 불완전한 future객체가 반환
4. Synchronous(동기적) 방식으로 실행되어야 할 다른 코드들이 있다면, 먼저 실행
5. 최종적으로 실제적인 data값이 future 객체로 전달[async method]
- async 키워드를 사용하는 순간 Dart는 다음 과정을 거친다.
1. 이 메서드를 통해서 나오는 결과물은 future임을 알게 된다.
2. await 키워드를 만날때까지 synchronous 방식으로 코드를 처리
3. await 키워드를 만나면 future가 완료될때까지 대기
4. future가 완료 되자마자 그 다음 코드들을 실행- Dart는 await 키워드가 붙은 메서드를 만나면, 해당 메서드의 실행이 끝날 때까지 잠시 다른 코드 실행을 멈추게 되는 것
[Future와 async 비교]
- async 키워드는 비동기 방식으로 실행되는 함수라는 것을 Dart에게 알려주는 기능을 담당하고, await 키워드와 함께 미래의 어느 시점에 전달될 값을 기다리는 것이다.
- 이와는 다르게 Future는 하나의 객체로써 객체가 생성된 순간에는 미완성으로 존재하다가, 미래에 어느 시점에 데이터를 전달받은 온전한 객체가 되거나 문제가 생성될 시 에러를 반환하는 객체가 된다.
[Ex]
void main() async { methodA(); await methodB(); await methodC('main'); methodD(); } methodA(){ print('A'); } methodB() async { print('B start'); await methodC('B'); print('B end'); } methodC(String from) async { print('C start from $from'); Future((){ print('C running Future from $from'); }).then((_){ print('C end of Future from $from'); }); print('C end from $from'); } methodD(){ print('D'); }
[결과 설명]
[A]
- main 에서 시작되는 methodA 에 의해 출력
[B start]
- main 함수에서 두번째로 실행되는 methodB 함수가 실행되어 출력
[C start from B]
- methodB 함수 내에서 await methodC('B'); 에서 await 키워드를 만나 methodC 함수의 실행이 끝날때까지 methodB 함수 내에서 그 이하의 코드 실행을 멈추게 된다. 따라서 methodC 함수 실행되어 출력
[C end from B]
- 다음 줄에 Future 키워드를 만나게 되어 Future 관련 코드들이 즉시 Event 큐에 등록된다. Future 다음 줄이 실행되어 출력
[B end]
- await 키워드가 붙은 methodC 함수의 실행이 완료되어 다음 줄이 실행되어 출력
[C start from main]
- main 에서 await 키워드가 붙은 methodC 함수가 실행되어 methodC 함수의 실행이 끝날때까지 그 이하의 코드들은 대기하게 된다. methodC 함수 첫줄 출력
[C end from main]
- 다음 줄에 Future 키워드를 만나게 되어 Future 관련 코드들이 즉시 Event 큐에 등록된다. Future 다음 줄이 실행되어 출력
[D]
- await 키워드가 붙은 methodC 함수의 실행이 완료되어 다음 줄이 실행되어 출력
[C running Future from B]
- main의 코드들이 끝까지 실행되어 Synchronous(동기적) 방식으로 실행되어야 할 다른 코드들이 없으므로 Event 큐에 저장되어 있던 Future 관련 코드들이 실행된다. 선입선출 방식이므로 해당 코드 실행
[C end of Future from B]
- then 코드에 의해서 해당 내용 출력
[C running Future from main]
- 선입 선출 방식에 따라 다음 내용 출력
[C end of Future from main]
- then 코드에 의해서 해당 내용 출력
300x250'Flutter' 카테고리의 다른 글
Flutter - VsCode 간단한 코드 정리 단축키 및 방법 (0) 2021.10.16 flutter - Error: The argument type 'String' can't be assigned to the parameter type 'Uri'.dart(argument_type_not_assignable) (0) 2021.10.10 Flutter - Future, async, await (0) 2021.10.07 flutter - 2.0 button ElevatedButton으로 구글, 페이스북, 메일 로그인 버튼 만들기 (1) 2021.10.06 Flutter - final 과 const (0) 2021.10.06