시배's Android
si8ae
시배's Android
Kotlin 동시성 프로그래밍 | 6장. 채널 - 통신을 통한 메모리 공 본문
채널의 이해
- 채널은 동시성 코드 간에 서로 안전한 통신을 할 수 있도록 해주는 도구다.
- 채널은 실행 중인 스레드에 상관없이 서로 다른 코루틴 간에 메시지를 안전하게 보내고 받기 위한 파이프라인으로 생각할 수 있다.
채널 유형과 배압
- 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 : 수신할 것이 있는지 여부를 확인한다.