스터디 노트/잡것

채널

webmaster 2022. 12. 12. 15:48
728x90

코루틴은 채널을 통해 데이터를 전달/전송 받는다.

코루틴 채널 종류

https://kotlinlang.org/docs/coroutines-and-channels.html#testing-coroutines

  • Unlimited channel
    • Unlimited channel 은 큐에 가장 가까운 채널이다. 생산자들은 이 채널에 요소를 무제한 요소를 보낼 수 있다.
    • send() 호출은 중단되지 않으며, 프로그램에 메모리가 부족하면, 메모리 부족 예외가 발생한다
    • 큐와 Unlimited channel 차이는 소비자가 빈 채널에서 receive()를 시도할 때, 새로운 요소가 전송될 때까지 중단된다는 차이점이 있다.
  • Buffered channel
    • 버퍼링된 채널의 크기는 지정된 숫자에 의해 제한되고, 생산자는 크기 제한에 도달할 때까지 이 채널로 전송할 수 있다.
    • 모든 요소는 내부적으로 저장이 되며, 채널이 꽉 차면 더 많은 공간을 사용할 수 있을 때 까지 채널에 대한 send() 호출이 중단된다.
  • Rendezvous channel(디폴트 값)
    • 버퍼가 없는 채널로 크기가 0인 Buffered channel과 같다(send()/ receive() 중 하나는 다른 함수가 호출될 떄까지 항상 중지된다)
    • send() 함수가 호출되고 요소를 처리할 준비가 된 일시 중단된 수신 호출이 없으면, send()가 일시 중단됩니다.
    • 반대로 recieve() 함수가 호출되고 요소를 보낼 준비가된 일시 중단된 송신 호출이 없으면 recieve() 호출이 일시 중단됩니다.
  • Conflated channel
    • 통합 채널로 전송된 새 요소는 이전에 전송된 요소를 덮어 쓴다
    • recieve() 함수는 항상 최신의 요소만 가지고 오며, send() 호출이 일시 중단되지 않는다.

코루틴에서의 channel

produces라는 이름의 편리한 코루틴 빌더와 소비자 쪽의 for 루프를 대체하는 확장 기능 consumeEach가 있다.

val squares = produceSquares()
squares.consumeEach { println(it) }
println("Done!")

 

728x90

'스터디 노트 > 잡것' 카테고리의 다른 글

Coroutine과 RXJava/RxKotlin 비교  (0) 2023.01.03
Patch Null 체크  (0) 2022.06.29
트러블 슈팅  (0) 2022.05.11
프로젝트에 도움이 되는 URL  (0) 2022.05.02
Null Object pattern  (0) 2022.01.17