Dart/비동기

Dart 문법 비동기 - Stream

codeJunH 2024. 8. 22. 17:17

Stream이란?

Stream은 '일련의' 비동기 이벤트를 가리키는 것으로, 계산이 종료된 비동기 작업의 결과를 순차적으로 받아오는 역할을 하는 이벤트 큐(event queue)이다.

 

주요 특징:

  1. 연속적인 비동기 데이터를 처리한다.
  2. 이벤트는 값, 에러, 또는 완료(done) 신호일 수 있다.
  3. 비동기 제네레이터 함수(async*)를 통해 생성된다.

 

 

Stream 생성 및 사용

Stream은 주로 async* 키워드를 사용한 비동기 제네레이터 함수를 통해 생성된다.

 

 

코드 분석

  1. countStream 함수:
    • async* 키워드로 비동기 제네레이터 함수로 선언된다.
    • Stream<int>를 반환 타입으로 지정한다.
    • yield 키워드를 사용하여 값을 스트림에 전달한다.
  2. sumStream 함수:
    • async 키워드로 비동기 함수로 선언된다.
    • await for 문을 사용하여 스트림의 값을 순차적으로 처리한다.
  3. main 함수:
    • async 키워드로 비동기 함수로 선언된다.
    • await를 사용하여 sumStream 함수의 결과를 기다린다.

 

 

Stream의 주요 개념

  1. 비동기 제네레이터 함수 (Asynchronous Generator Function):
    • async* 키워드로 선언된다.
    • Stream<T>를 반환 타입으로 가진다.
    • yield 키워드를 사용하여 값을 스트림에 전달한다.
  2. 동기 제네레이터 함수 (Synchronous Generator Function):
    • sync* 키워드로 선언된다.
    • Iterable<T>를 반환 타입으로 가진다.
  3. await for 문:
    • 스트림에서 값을 순차적으로 받아오는 데 사용된다.
    • async 함수 내에서만 사용 가능하다.

 

 

Stream의 장점

  1. 연속적인 데이터 처리: 실시간 데이터, 파일 읽기, 네트워크 응답 등을 처리하는 데 적합하다.
  2. 메모리 효율성: 대량의 데이터를 한 번에 메모리에 로드하지 않고 순차적으로 처리할 수 있다.
  3. 비동기 프로그래밍 간소화: 복잡한 비동기 작업을 직관적으로 표현할 수 있다.

 

 

Stream 사용 시 주의사항

  1. 리소스 관리: 스트림을 더 이상 사용하지 않을 때는 반드시 닫아주어야 한다.
  2. 에러 처리: 스트림 처리 중 발생할 수 있는 에러를 적절히 처리해야 한다.
  3. 백프레셔(Backpressure) 관리: 데이터 생성 속도가 처리 속도보다 빠를 경우 적절한 전략이 필요하다.