비동기 프로그래밍이란?

 

일단 동기(Syncronous)는 무엇이고 비동기(Asyncronous)는 무엇인가?

  -> 동기는 blocking되는 코드 -> 이전 명령이 안끝나면 다음명령이 실행 되지 않음

  -> 비동기는 blocking되지 않는 코드 -> 이전 명령이 안끝나도 다음명이 실행 됨 

 

왜 동기적인 작업이 문제가 될까? 예를들어

  -> 파일을 불러올때

  -> 데이터베이스에 데이터를 쓸때

  -> 네트워크로부터 데이터를 불러올때

등등 여러 케이스에서 한 작업이 끝날때까지 뒤의 모든 작업이 기다리게 된다. 

이럴 경우 시간적으로 손해가 크기때문에 동기화된 작업은 추천 되지 않는다 

 

그렇다면 비동기는? 작업이 완료될때까지 기다리지 않고 다음 작업을 바로 실행함(병렬적)

그렇다면 결과값은? 작업이 마무리되면 그때 데이터를 받음 

 

dart에서는 dart.async 라이브러리를통해 Future, Stream기능, 비동기 프로그래밍을 지원하게 된다 

 

Future을 알아보자

Future을 사용할 때 반환 되는 타입은 Future타입이다. Future타입안에 데이터타입이 명시 된다. 

Future<int> number = Future.value(1);
Future<String> name = Future.value('스트링');
Future<bool> isTrue = Future.value(true);

 

언제 쓰일까?

  -> 하나의 작업에 대해 이벤트가 한번 발생하는 단일 비동기 작업에 사용된다. 

void main(){
  int seconds = 2;
  print('start');
  Future.delayed(Duration(seconds: seconds), () {
    print("waited $seconds");
  });
  print('done');
}

// 출력되는 결과
/*
  start
  done
  waited 2
*/

 

비동기 작업을 동기화 처럼 사용하고자 할때(순서를 지켜서 실행해야할때) async, await키워드를 사용해서 코드를작성한다 

void main() async{
  int seconds = 2;
  print('start');
  await Future.delayed(Duration(seconds: seconds), () {
    print("waited $seconds");
  });
  print('done');
}

// 출력되는 결과
/*
  start
  waited 2
  done
*/

 

하지만 Future은 단 한번만 결과값을 받게 된다. 그래서 Stream을 사용한다

 

Stream에 대해 알아보자

제일 큰 특성은 시간에 따라 연속적인 데이터 흐름을 제공한다

연속적으로 데이터를 받을 수 있기 때문에 프로그램이 임의로 Stream을 종료하지 않는다

사용자가 Stream을 시작하고 끝을 내야한다.

 

예제로 알아보기전에 yield와 listen() method를 알아야 한다 

 

yield는 값을 방출하도록 하는 키워드 -> return 과 비슷하다고 생각하면 된다

listen()은 yield로 방출되는 값을 얻기위해 사용되는 메서드다

 

예제로 알아보자 

참고로 Stream을 적용한 함수에는 async* 키워드를 달아주어야한다 async가 아니다 

아래 예제는 입력받은 숫자부터 0까지 1초를 기다리면서 출력한는 예제이다 

Stream<int> emitNUmbers(int first) async* {
  for(var i = first; i >= 0; i--){
    yield i;
    
    await Future.delayed(Duration(seconds:1));
  }
}

void main() {
  emitNumbers(10).listen((number) {
    print(number);
  }
}

/*
  10
  9
  8
  7
  6
  5
  4
  3
  2
  1
  0
  이 차례대로 출려 됨 
*/

 

참고로 고차함수로 체이닝하여 사용할 수도 있다고 한다. 

체이닝을 사용하면 특정 값만 걸러내서 받을 수도 있을거같다. 

+ Recent posts