시배's Android

Kotlin Coroutines Deep Dive | 17장. 셀렉트 본문

Book/Kotlin Coroutines Deep Dive

Kotlin Coroutines Deep Dive | 17장. 셀렉트

si8ae 2024. 2. 19. 21:39
  • 코루틴은 가장 먼저 완료되는 코루틴의 결과를 기다리는 select 함수를 제공합니다.
  • 또한 여러 개의 채널 중 버퍼에 남은 공간이 있는 채널을 먼저 확인하여 데이터를 보내거나, 이용 가능한 원소가 있는 채널로부터 데이터를 받을 수 있는지 여부도 확인할 수 있습니다.
  • 코루틴 사이에 경합을 일으키거나, 여러 개의 데이터 소스로부터 나오는 결과값을 합칠 수도 있습니다.

지연되는 값 선택하기

  • 여러 개의 소스에 데이터를 요청한 뒤, 가장 빠른 응답만 얻는 경우를 생각해봅시다.
  • 요청을 여러 개의 비동기 프로세스로 시작한 뒤, select 함수를 표현식으로 사용하고 표현식 내부에서 값을 기다리는 것입니다.
  • select 내부에서는 셀렉트 표현식에서 나올 수 있는 결괏값을 명시하는 Deferred 값의 onAwait 함수를 호출합니다.
  • 람다식 내부에서 값을 변환할 수 도 있습니다.
suspend fun askMultipleForData() : String = coroutineScope { 
	select<String> {
    	async { requestData1() }.onAwait { it } 
        async { requestData2() }.onAwait { it }
    }
}
  • asynsc와 select를 사용하면 코루틴끼리 경합하는 상황을 쉽게 구현할 수 있지만, 스코프를 명시적으로 취소해야 합니다.
  • select가 값을 생성하고 나서 also를 호출한 뒤 다른 코루틴을 취소할 수 있습니다.
  • 많은 개발자는 헬퍼 함수를 정의하거나 raceOf 함수를 지원하는 외부 라이브러리를 사용합니다.

채널에서 값 선택하기

  • onReceive : 채널이 값을 가지고 있을 때 선택됩니다. onReceive가 선택되었을 때, select는 람다식의 결괏값을 반환합니다.
  • onReceiveCatching : 채널이 값을 가지고 있거나 닫혔을 때 선택됩니다. ChannelResult를 받으며, 이 값을 람다식의 인자로 사용합니다.
  • onSend : 채널의 버퍼에 공간이 있을 때 선택됩니다. 채널 에 값을 보낸 뒤, 채널의 참조값으로 람다식을 수행합니다.