Future, Isolate
다트에서 이벤트 루프에 등록되는 애들이 있음
보통은 다 바로 시작이 되는데 이벤트 루프에 등록되는 애들은 특징이 main()이 종료되어야지 실행
- network
- I/O (file 읽기 쓰기)
- 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 |