본문 바로가기
[coroutine] Back-pressure 대응하기 - Back pressure 는 한국어로 "배압" 이라고 하며, Flow 의 세계에서는 emit 되는 속도보다 collect 되는 속도가 느린 현상을 이야기한다. (돼왕: input 이 쌓여 buffer 가 필요한 상황) 이에 대한 해결방법은 여러가지가 있겠다. - 아래와 같은 기본 로직이 있다고 하자. 이 로직은 emit 은 1초 단위로 되는데, collect 는 3초 이상을 소비한다. 즉 back pressure 가 발생하는 것이다. var start = 0L fun currTime() = System.currentTimeMillis() fun emitter(): Flow = (1..5) .asFlow() .onStart{ start = currTime() } .onEach{ delay(1000) p.. 2022. 2. 2.
[coroutine] withContext vs async - withContext 와 async 를 언제 어떻게 쓰면 좋을까? - 동일한 구문을 돌리는 경우 withContext 가 async 보다 약 2배의 성능이 좋았다는 테스트 결과가 있다. https://stackoverflow.com/questions/50230466/kotlin-withcontext-vs-async-await for(1..1_0000_0000){ withContext(context){ // do sth } } vs for(1..1_0000_0000){ async(context){ // do sth }.await() } 메모리 사용량은 큰 차이가 없다고 한다. - 직접 성능 측정해 보았다. launch { val duration = measureTimeMillis { for (i in .. 2022. 2. 1.
[Coroutine] Exception handling in coroutine # coroutine builder 에 exception 이 발생하면 parent 를 cancel 하고, parent 가 cancel 되면 모든 children 을 cancel 시킨다. (exception propagation) Stop breaking my coroutines # Exception propagation 은 job 을 기반으로 작동하기 때문에 try-catch 로 잡히지 않는다. SupervisorJob # SupervisorJob 은 한 child 의 exception 이 parent 와 다른 children 을 cancel 시키지 않는다. # 일반적인 실수는 parent coroutine 에 SupervisorJob 을 전달하는 것이다. 예를 들면 launch 에 SupervisorJ.. 2022. 1. 30.
[Coroutine] Coroutine scope functions Approaches before coroutine scope functions # GlobalScope 은 EmptyCoroutineContext 를 사용하므로 다음과 같은 단점을 갖는다. 취소하기 어렵다. -> memory leak, cpu res 낭비 Parent 의 scope 속성을 상속하지 않는다. -> unit test 가 어렵다. # GlobalScope 을 사용하지 않기 위해 CoroutineScope 을 전달하는 경우가 있는데, 이는 또 다른 단점을 야기할 수 있다. 전달받은 scope 를 계속 다른 곳으로 전달하여 사용할 수 있으며, 이 경우 한 곳에서 발생한 exception 이 원하지 않는 다른 job 들을 모두 취소시킬 수 있다. (SupervisorJob 을 사용하지 않았다면) E.. 2022. 1. 29.
[coroutine] Flow vs RxJava - 이 글은 RxJava 는 써보고, Flow 는 안 써본 개발자 입장에서 정리한 글. Core functionality - view state 와 effects 를 만들고 업데이트 하기 위해 coroutine 1.3.6 부터는 StateFlow 와 MutableStateFlow 를 제공한다. Retrofit - // Flow interface FeedService { @GET("lists/{listType}") suspend fun getTweets( // suspend 를 붙여준다. @Path(LIST_TYPE_PATH listType:String, @Query(LIST_ID_QUERY) listId:String, @Query(LIST_COUNT_QUERY) count:String, @Query(LI.. 2021. 5. 10.
[coroutine] SharedFlow & StateFlow StateFlow - StateFlow 는 observable flow 로 collector 에게 현재값과 업데이트 되는 새로운 값을 전달하는 녀석이다. 현재 값을 value property 를 통해 읽을 수도 있다. state 를 update 하고 flow 에게 그 값을 보내기 위해서는 MutableStateFlow 에 value 값을 설정해주면 된다. flow { } builder 로 만든 녀석들은 cold flow 이지만, StateFlow 는 hot flow 이다. 따라서 collect 하는 순간 최신 값을 전달받는다. - class LatestNewsViewModel(private val newsRepository: NewsRepository) : ViewModel() { // Backing p.. 2021. 5. 8.
[kotlin] LazyThreadSafeMode SYNCHRONIZED vs. PUBLICATION - lazy 함수의 기본 thread-safe 동작은 SYNCHRONIZED 이다. 즉 thread-safe 하다는 말이다. - SYNCHRONIZED 는 우리가 익히 알고 있는 동기화가 보장된 호출이다. 한 thread 에서만 접근할 수 있고, 해당 연산이 끝난 결과값을 다른 thread 에서 공유해서 사용하는 방식이 된다. - PUBLICATION 은 초기화 과정을 여러 스레드가 동시에 수행할 수 있으나, 다른 스레드에서 초기화하여 할당된 값이 있다면 그 값을 반환한다. 다시 말해 init 코드는 여러 번 탈 수 있으나 race condition 에서 한 thread 에 의해 최초 write 된 값을 모든 thread 에서 share 해서 사용하는 방식이 된다. - NONE 은 별도의 thread-s.. 2021. 1. 28.
[Kotlin] Coroutine 소개 https://www.slideshare.net/elizarov/introduction-to-kotlin-coroutines -Coroutine 개념은 아주 오래된 녀석이다.Simula 67 이란 언어에서 처음으로 소개된 개념이다. detach : suspension statement resume : resume coroutine execution -Coroutine 은 multithreading 이 나오면서 잠시 out 되어있었다.그러나 최근에 async code 가 많이 사용되면서 다시 주목받기 시작했다. -Thread 는 resource 측면에서 high-load 이며,single thread 만 지원하는 언어들도 있으며,mutable state 가 많고, UI operation 같이 thread .. 2020. 8. 24.
[Kotlin] Coroutine 은 어떻게 동작하는가? 코루틴은 어떻게 동작하는가? -돼욍 CommentCoroutine 이 StateMachine 형태로 동작함을 rough 하게 이해할 수 있다.StateMachine 의 상태 변화에 따라 값을 save & fetch 한다는 것을 rough 하게 이해할 수 있다.Continuation 이라는 것을 재활용해 Dispatcher 를 포함한 context 를 계속 물고 갈 수 있음을 rough 하게 이해할 수 있다. -Kotlin 의 Coroutine 은 suspend 키워드로 마킹된 함수를 CPS(Continuation Passing Style)로 변환하고, 이를 Coroutine Builder 를 통해 적절한 스레드 상에서 시나리오에 따라 동작하도록 구성된다. -suspend function 은 스레드와 스케.. 2020. 8. 23.
반응형