채널은 코루틴끼리 통신을 위한 api이다.
송신자와 수신자의 수에 제한이 없고 전송된 모든 값은 한번만 받을 수 있다.
Channel 인터페이스는 SendChannel
과 ReceiveChannel
을 구현한 인터페이스인데 이 인터페이스들은 각각 send
와 receive
라는 suspend 함수를 갖는다.
send
는 채널의 용량이 모두 찼을 때 공간이 생길 때까지 중단된다.
receive
는 채널에서 가져올 원소가 없을 때 원소가 생길 때까지 중단된다.
https://pl.kotl.in/Gj4FhV6Wo?theme=darcula
위와 같은 방식으로 수신부, 송신부를 만들면 수신부가 얼만큼의 원소가 보내질 지 알아야 한다는 단점이 있다. 일반적으로 수신자는 그 정보를 알지 못하기 때문에 채널이 닫힐 때까지 받을 수 있도록 for
루프나 consumeEach
함수를 사용한다.
https://pl.kotl.in/6AQ5UVCdE?theme=darcula&from=4&to=22"></iframe>
위 코드는 수신자가 채널이 닫힐 때까지 계속 원소를 받을 수는 있지만, 송신자가 채널을 닫는 것을 잊을 수 있다는 문제가 있다. 특히 예외가 발생한 경우가 그렇다.
이럴 경우 수신자가 계속 기다리기 때문에 ReceivedChannel
을 반환하는 코루틴 빌더인 produce
함수를 사용하는 것이 안전하고 편리하다. produce
함수는 어떻게 종료되든 상관없이 close
를 반드시 호출한다.
https://pl.kotl.in/rijuCVzQN?from=4&to=18&theme=darcula
채널은 용량에 따라 4가지로 분류가 가능하다.
Channel.UNLIMITED
로 설정send
가 중단되지 않음Channel.BUFFERED
로 설정Channel.BUFFERED
의 기본값은 64, JVM의 kotlinx.coroutines.channels.defaultBuffer
를 설정하면 오버라이드 가능