Future, Isolate

다트에서 이벤트 루프에 등록되는 애들이 있음

보통은 다 바로 시작이 되는데 이벤트 루프에 등록되는 애들은 특징이 main()이 종료되어야지 실행

  1. network
  2. I/O (file 읽기 쓰기)
  3. Future(약속)

Future

import 'dart:io';

void download(){
    sleep(Duration(seconds:5));
    print('다운완료');
}

main(){
    download();
    print("메인종료");
}

----
다운완료
메인종료
----
  • 실행 순서
import 'dart:io';

void download(){
Future.delayed(Duration(seconds:5),(){
        print('이벤트 실행됨'): // 3
    });
    print('다운완료'); // 1
}

main(){
    download();
    print("메인종료"); // 2
}

----
다운완료
메인종료
이벤트 실행됨
----
  • Future return
import 'dart:io';

Future<String> download(){
// Future는 빈박스이다.
// 먼저 value는 빈박스(null)를 만들고 5초뒤 return을 받음
Future<String> value = Future.delayed(Duration(seconds:5),(){
        return '사과'; // 5초뒤에 return을 받음
    });
return value; // Futurn data는 Future로 받아야함
}

// 첫번째 방법
// await를 사용하기 때문에 async 키워드 필요
main() async {
    //빈박스를 먼저 받아오기 때문에 Future로 받아야함
    //그렇기에 기다릴 필요가 있음 -> await 사용 -> async 키워드 필요
    // Future<String> value = download();
    // 기다렸다 받기 때문에 Future로 받을 필요없음
    String value = await download();
    print(value);
}

// 두번째 방법
main(){
    download().then((value){
        // 빈박스가 채워져야 실행됨
        print(value);
    });
//메인 종료 후 download return 받음
}

Isolate

  • 동시에 실행
void download(var msg){
    Future((){
        for(int i = 0; i < 5; i++){
            sleep(Duration(seconds:1));
            print("download함수 : ${i}");
        }
    });
}

main(){
    // 독립적인 스레드
    Isolate.spawn(download,'msg');
    for(int i = 0; i < 5; i++){
        sleep(Duration(seconds:1));
        print("main함수 : ${i}");
    }
}

isolate는 다른 언어의 스레드와 똑같음

다른 점은 heap을 공유하지 않음. 독립적인 heap이 있음

int num = 10;

void change(var value){
    num = value;
    print("change : ${num}");
}

void check(var value){
    print("check : ${num}");
}

void main(){
    Isolate.spawn(change,20);
    Isolate.spawn(check,"");
}

---
check : 10
change : 20
---

어떤 이벤트가 들어왔을때 이 이벤트 때문에 오래 기다려야할 땐 Future

동시 실행 하고 싶을땐 isolate

728x90

'Study > Dart' 카테고리의 다른 글

[Dart] future, async, await, 실행순서  (0) 2021.06.15
[Dart] const 와 final 이해하기  (0) 2021.06.15
[Dart] 상속을 쓰는 이유  (0) 2021.06.07
[Dart] 상속  (0) 2021.06.07
[Dart] 접근지정자, 생성자, getter, setter  (0) 2021.06.04

+ Recent posts