본문 바로가기

코틀린

channels 7주차 1차 스터디 Fan-in 까지 Fan-out 구독자가 여러 어럿 있는 상황을 살펴보고있다. -> 값을 소비하는 코루틴이 여러개임 생산자 코드가 이러하고 -> 1초에 값 10개 생산 fun CoroutineScope.produceNumbers() = produce { var x = 1 // start from 1 while (true) { send(x++) // produce next delay(100) // wait 0.1s } } 소비하는 코드가 이러하다. -> 누가 소비하는지 숫자로 나타내줌 fun CoroutineScope.launchProcessor(id: Int, channel: ReceiveChannel) = launch { for (msg in channel) { println("Processor #$id received.. 더보기
channels 6주차 2차 스터디 Prime numbers with pipeline 까지 Pipelines 공식문서의 설명이 사실 난해하다고 생각한다. 일단 공식문서에 나와있는 부분을 해석해보고 이에대해 추가 조사한 자료들을 통해 다시 정리해보려한다. 파이프 라인은 하나의 코루틴이 값의 스트림을 무한이 만들어낼 수 있는 패턴이라고 한다. fun CoroutineScope.produceNumbers() = produce { var x = 1 while (true) send(x++) // infinite stream of integers starting from 1 } 예시가 이런데 while문으로 열어놓고 cancel 로 종료하는 형태를 주로 다룬다. 그리고 왜인지는 의문이지만 channels에는 딱히 중간연산자가 없다(map,filter 이런거 조차도 없다...) 그래서 이런것들을 chann.. 더보기
channels 6주차 1차 스터디 Building channel producers 까지 Channels 드디어 flow를 넘어 Channel 이다. 팀과 함께 스터디하니 높아보였던 장벽이 깰만했던것 같아 기분이 좋다. 이제 들어가보자!!! Deferred(async를 통해서 내뱉고 하는것) 을 통해 코루틴에서 single value를 전달할 수 있었다. 이제 Channels 는 값들의 stream을 전달할 수 있는 방법이다. Channel basics Channel 은 컨셉이 BlockingQueue와 비슷하다고 한다.(BlockingQueue가 뭔데 씹덕아) BlockingQueue의 put 연산을 send를 통해하고 take연산을 receive를 통해서 한다고한다. 이때 주요 차이점이 BlockingQueue는 대기 해야하는 상황에 쓰레드에 Block을 걸어버리는 반면에 -> Block.. 더보기
flow 5주차 1차 스터디 flow끝까지 Flow completion flow 종료시점에 작업을 해야할때 취할수있는 방법은 두가지이다. 선언적 방법, 명령형 방법 그냥 딱봐도 선언적 방법 쓸것같다... Imperative finally block trt/catch의 finally 블록을 이용하면 collect가 종료되는 시점의 작업을 해줄 수 있다. fun simple(): Flow = (1..3).asFlow() ​ fun main() = runBlocking { try { simple().collect { value -> println(value) } } finally { println("Done") } } ​ //결과 1 2 3 Done 가능이야 하겠지만 뎁스 깊어지는거 너무 열받지 않는가? 우테코 하고나서 성격이 나빠졌는지 이런것들을 보.. 더보기
Flow 4주차 2차 스터디 CatchingDeclaratively까지 Flow exceptions 자자자 이제야 나온다 오류 우하하하하하하하 Flow는 emit하는 도중, 연산자(중간,터미널) 에서 exception을 던지는 상황이 나온다면 exception으로 종료될 수 있다. 이에 대처하는 방법에 대해 다룬다고 한다. Collector try and catch 그냥 코틀린 tryCatch로 잡는 방법을 소개한다. 뭐 당연스럽게 runCatching으로 잡아도 될것이다. fun simple(): Flow = flow { for (i in 1..3) { println("Emitting $i") emit(i) // emit next value } } ​ fun main() = runBlocking { try { simple().collect { value -> println.. 더보기
Flow 4주차 1차 스터디 flatMapLatest 까지 Composing multiple flows 플로우를 합쳐내는 방법을 다룬다. Zip zip 사실 잘 안써서 생소하지만 두 플로우를 섞어서 쓸 수 있는 방법으로 zip이 있다. 예전에 학습했던 컬렉션 api를 뒤져보면 관련된 사용법을 겁나 많이 찾을 수 있을듯 하다 val nums = flow{ repeat(3){ emit(it) delay(100) } } // numbers 1..3 val strs = flow{ emit("???") } // strings nums.zip(strs) { a, b -> "$a -> $b" } // compose a single string .collect { println(it) } // collect and print ​ //결과 //0 -> ??? 이런저런 실험을 해.. 더보기
Flow 2주차 3차 스터디 Processing the latest value까지 Flow context Flow 생성자가 어떻게 생겨먹었든 간에 이것이 수집되는 블록의 코루틴 Context를 따른다(변경 방법이야 있겠지만) 그래서 이러한 특성을 context preservation(컨텍스트 보존) 이라고 부른다고 한다. 이에 대한 예시를 들어주는데 fun simple(): Flow = flow { log("Started simple flow") for (i in 1..3) { emit(i) } } ​ fun main() = runBlocking { simple().collect { value -> log("Collected $value") } } ​ //결과 //[main @coroutine#1] Started simple flow //[main @coroutine#1] Collec.. 더보기
Flow 2주차 2차 스터디 Flows are sequential 까지 Flows Are Cold Flow가 cold stream 임을 설명한다. 우리는 Cold Stream 이 무엇인지 선행학습을 했으니 그냥 키워드만 들어도 어떤것인지 알 수 있었다. 결론적으로 공식문서에서는 Lazy하게 값을 뽑아온다는것을 설명하고있다. Flow cancellation basics Flow는 general cooperative cancellation of coroutines를 따른다고 하는데 직역하면 코루틴의 협력적 취소이다. Coroutine의 취소되는 메커니즘은 생각보다 간단하지는 않다. -> 많은 내부적인 동작원리들을 알아야한다. 만약 코루틴의 cancelleation이 익숙치 않다면 이글을 보고오자 만약 글을 보고와서 예제를 살펴본다면 그냥 당연한소리 하면서 와닿을것이다 Flow .. 더보기