Coroutines Channel
Coroutines와 Channels 튜토리얼 - 2. Blocking Requests
Blocking 요청들 GitHub에 HTTP 요청을 하기 위해 Retrofit 라이브러리를 사용할 것이다. 주어진 조직에 속한 저장소 목록과 각 저장소의 기여자 목록을 요청할 수 있다. interface GitHubService { @GET("orgs/{org}/repos?per_page=100") fun getOrgReposCall( @Path("org") org: String ): Call @GET("repos/{owner}/{repo}/contributors?per_page=100") fun getRepoContributorsCall( @Path("owner") owner: String, @Path("repo") repo: String ): Call } 이 API는 주어진 조직의 기여자 목록을 가..
Coroutines와 Channels 튜토리얼 - 1. 시작하기 전 준비하기
이 튜토리얼에서는 IntelliJ IDEA를 사용해, 실행중인 Thread나 Callback을 블록하지 않고 코루틴을 사용하여 네트워크 요청을 수행하는 방법을 살펴볼 것이다. 📖 당신은 Kotlin 기초 구문에 익숙해야 하지만, Coroutines에 대한 사전 지식은 필요하지 않습니다. 당신은 다음의 사항들에 대해 배울 것입니다. 네트워크 요청을 하기 위해 일시 중단 함수를 왜 그리고 어떻게 사용해야 하는지 Coroutines을 사용하여 요청을 동시에 보낼 수 있는 방법 서로 다른 Coroutines 간에 Channels를 이용하여 정보를 공유하는 방법 네트워크 요청들을 위해서 Retrofit 라이브러리를 필요로 하지만, 이 튜토리얼에서 보여지는 접근 방식은 보편적이고 Coroutines를 지원하는 다른..
Coroutine Channels 4편 - Buffered channels, Channel은 평등하다, Ticker channels
Buffered channels*1 지금까지 보여진 Channel에는 Buffer가 없다. Buffer되지 않은 채널은 발신자와 수신자가 서로 만날 때 값을 전송한다. 이는 랑데뷰라고도 불린다.*2 만약 send가 먼저 실행되면, receive가 실행될 때까지 일시 중단된다. 만약 receive가 먼저 실행되면, send가 실행될 때까지 일시 중단된다. Channel() 팩토리 함수와 produce 빌더 모두 Buffer 크기를 정하기 위해 선택적으로 capacity 파라미터를 받는다. BlockingQueue와 비슷하게, Buffer은 지정된 capacity만큼의 용량을 두고 발신자가 일시 중단 전에 복수의 원소들을 보낼 수 있도록 하고*3, Buffer가 꽉 차면 중단*4한다. 다음 코드의 동작을 살..
Coroutine Channels 3편 - Fan-out과 Fan-in : Channel이 얼마나 많은 출력, 입력을 만들 수 있는지 알아보기
Fan-out*1 복수의 Coroutine은 같은 채널로부터 수신하면서, 그들간에 작업을 분산할 수 있다. 1초에 10개의 숫자를 주기적으로 정수를 생성하는 생산자 Coroutine으로 시작하자 : fun CoroutineScope.produceNumbers() = produce { var x = 1 // start from 1 while (true) { send(x++) // produce next delay(100) // wait 0.1s } } 그러면 우리는 몇개의 프로세서 Coroutine*2을 가질 수 있다. 이 예에서 프로세서 Coroutine은 그들의 id와 받은 숫자를 출력한다. fun CoroutineScope.launchProcessor(id: Int, channel: ReceiveCh..
Coroutine Channels 2편 - Channel로 파이프라인 만들기, 파이프라인으로 소수 만들기
Channel로 파이프라인 만들기 파이프라인은 하나의 Coroutine이 값의 스트림을 생성하는 것을 뜻한다. 값의 스트림은 무한할 수도 있다. fun CoroutineScope.produceNumbers() = produce { var x = 1 while (true) send(x++) // infinite stream of integers starting from 1 } 그리고 다른 Coroutine이나 Coroutines 들이 그 스트림을 소비하고, 작업을 수행하고, 다른 결과를 생성한다. 아래의 예시에서 숫자들은 단순히 제곱된다. fun CoroutineScope.square(numbers: ReceiveChannel): ReceiveChannel = produce { for (x in numbe..