Dart Future, Isolate

Ruinak·2021년 9월 24일
1

Dart

목록 보기
11/11
post-thumbnail

Future

  • 다트에서 이벤트 루프에 등록되는 애들이 있습니다.
  • 보통은 다 바로 시작이 되는데 이벤트 루프에 등록되는 애들은 특징이 main( )이 종료되야지 실행됩니다.
    1. Network
    2. I/O (file 읽기, 쓰기)
    3. Future(약속)

기본적인 사용

void download(){
  print("1번 다운 시작"); 
  // 2번째 인자에 함수를 넣어서 무언가를 5초 뒤에 실행시킴
  // 우선 등록만 실행해놓고 main( )을 종료 시킴
  Future<String> value = Future.delayed(Duration(seconds: 3), () {  
    print("4번 이벤트 실행됨");
  });
  // sleep은 대기를 명령  
  // sleep(Duration(seconds: 3));
  print("2번 다운 완료");
}

main() async {
  print("3번 메인 종료"); 
}

Future await / async

// Future는 Future로 return해줘야함
Future<String> download(){
  print("1번 다운 시작"); 
  // 2번째 인자에 함수를 넣어서 무언가를 5초 뒤에 실행시킴
  // 우선 등록만 실행해놓고 main( )을 종료 시킴
  // Future는 빈박스입니다.
  Future<String> value = Future.delayed(Duration(seconds: 3), () {  
    print("4번 이벤트 실행됨");
    // 바로 value 값이 들어옴
    return "사과";
  });
  // sleep은 대기를 명령  
  // sleep(Duration(seconds: 3));
  print("2번 다운 완료");
  return value;
}

main() async {
  String value = await download();  // download는 빈박스 = await는 빈박스가 채워져야 실행됨
  print(value);
  print("3번 메인 종료"); 
}

Future then

// Future는 Future로 return해줘야함
Future<String> download(){
  print("1번 다운 시작"); 
  // 2번째 인자에 함수를 넣어서 무언가를 5초 뒤에 실행시킴
  // 우선 등록만 실행해놓고 main( )을 종료 시킴
  // Future는 빈박스입니다.
  Future<String> value = Future.delayed(Duration(seconds: 3), () {  
    print("4번 이벤트 실행됨");
    // 바로 value 값이 들어옴
    return "사과";
  });
  // sleep은 대기를 명령  
  // sleep(Duration(seconds: 3));
  print("2번 다운 완료");
  return value;
}

main() {
   // Future는 빈박스 = then은 빈박스가 채워져야 실행됨
  download().then((value) {
    // 빈박스가 채워져야 실행됨
    print(value);
  }); 
  print("3번 메인 종료"); 
}

순서대로 그리기

void download(){
  for(int i = 0; i < 5; i++){
      sleep(Duration(seconds: 1));
      print("download 함수 : ${i}");
    }
}

main(){
  download();
  for(int i = 0; i < 5; i++){
    sleep(Duration(seconds: 1));
    print("main 함수 : ${i}");
  }
}

main 먼저 그리기

void download(){
  // main 함수를 먼저 실행하고 싶으면 download의 for문을
  // 이벤트 루프(Future)에 등록시키면 됨
  Future(() {
    for(int i = 0; i < 5; i++){
        sleep(Duration(seconds: 1));
        print("download 함수 : ${i}");
      }
  });
}

main(){
  download();
  for(int i = 0; i < 5; i++){
    sleep(Duration(seconds: 1));
    print("main 함수 : ${i}");
  }
}

Isolate

동시에 그리기

void download(var msg){
  // main 함수를 먼저 실행하고 싶으면 download의 for문을
  // 이벤트 루프에 등록시키면 됨
  Future(() {
    for(int i = 0; i < 5; i++){
        sleep(Duration(seconds: 1));
        print("download 함수 : ${i}");
      }
  });
}

main(){
  // Isolate는 독립적인 스레드로 동시에 진행하고 싶을 때 사용
  Isolate.spawn(download, "download 실행");
  for(int i = 0; i < 5; i++){
    sleep(Duration(seconds: 1));
    print("main 함수 : ${i}");
  }
}

Isolate의 특징

  • Isolate는 다른 언어의 스레드와 똑같습니다.
  • 다른점은 heap을 공유하지 않습니다.
  • 독립적인 heap이 있음.
  • 이벤트가 들어왔을 때 그거 때문에 오래 기다려야 함. Future 사용
  • 동시에 실행할 때 isolate 사용
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,  num);
}

profile
Nil Desperandum <절대 절망하지 마라>

0개의 댓글