시배's Android

Kotlin 동시성 프로그래밍 | 6장. 채널 - 통신을 통한 메모리 공 본문

Book/Kotlin 동시성 프로그래밍

Kotlin 동시성 프로그래밍 | 6장. 채널 - 통신을 통한 메모리 공

si8ae 2023. 7. 26. 22:35

채널의 이해

  • 채널은 동시성 코드 간에 서로 안전한 통신을 할 수 있도록 해주는 도구다.
  • 채널은 실행 중인 스레드에 상관없이 서로 다른 코루틴 간에 메시지를 안전하게 보내고 받기 위한 파이프라인으로 생각할 수 있다.

채널 유형과 배압

  • Channel의 send()는 일시 중단 함수다.
  • 흔히 배압이라고 하며 리시버가 실제로 처리할 수 있는 것보다 더 많은 요소들로 채널이 넘치지 않도록 도와준다.
  • 배압을 구성하기 위해 채널에 대한 버퍼를 정의할 수 있다.
  • 채널을 통해 데이터를 보내는 코루틴은 채널 안의 요소가 버퍼 크기에 도달하면 일시 중단된다.
  • 채널에서 요소가 제거되는 즉시, 송신자는 다시 재개된다.

언버퍼드 채널

  • 버퍼가 없는 채널을 언버퍼드 채널이라고 한다.
  • RendezvousChannel
  • send()를 호출하면 리시버가 receive()를 호출할 때까지 일시 중지된다.
  • val unBufferedChannel = Channel<Int>()
  • val unBufferedChannel = Channel<Int>(0)

버퍼드 채널

  • LinkedListChannel
    • 중단 없이 무한의 요소를 전송할 수 있는 채널
    • 채널은 메모리를 너무 많이 소모할 수 있기 때문에 사용할 때 주의해야 한다.
  • ArrayChannel
    • 버퍼 크기를 0부터 int.MAX_VALUE - 1 까지 가지며, 가지고 있는 요소의 양이 버퍼 크기에 이르면 송신자를 일시 중단한다.
  • ConflatedChannel
    • 채널에는 하나의 요소의 버퍼만 갖고 있고, 새로운 요소가 보내질 때마다 이전요소는 유실된다.
    • 채널은 송신자를 절대 일시 중지하지 않는다.
    • 대신에 가져오지 않은 요소를 덮어쓴다.

SendChannel 

  • isClosedForSend : 전송을 위한 채널이 닫히지 않았는지 확인한다.
  • isFull : 채널 용량이 부족한지 체크한다.
  • send : 일시 중단 요소 전송 함수
  • offer : 비 일시 중단 요소 전송 함수
    • 채널이 닫힌 상태 : ClosedSendChannel 예외를 던짐
    • 채널이 가득 찬 상태 : false를 반환한다.
    • 채널이 열리고 가득 차지 않은 상태 : 요소를 대기열에 추가한다. 

ReceiveChannel

  • isClosedForReceive : 수신에 대해 닫힌 채널인지 여부를 나타낸다.
  • receive : 닫힌 채널에서 호출되면, ClosedReceiveChannelException이 발생한다.
  • isEmpty : 수신할 것이 있는지 여부를 확인한다.