본문 바로가기

코틀린

(15)
CoroutineScope 의 cancel() 전파 Scope의 자식 Scope 에서 Exception 이 났을 때 동작 아무런 처리도 하지않았을 때 CoroutineScope(Dispatchers.IO).launch { launch(CoroutineName("child1")){ delay(1000) Log.d("dayun","${this} end") }.invokeOnCompletion { Log.d("dayun","child1 throwable = $it") } launch(CoroutineName("child2")){ throw Exception("test") }.invokeOnCompletion { throwable -> Log.d("dayun","child2 throwable = $throwable") } delay(1000) Log.d("day..
코틀린 Flows의 소개 Flow는 코틀린 언어에 있는 것으로 특정시간에 걸쳐 여러 값을 순차적으로 방출하는 특징이 있는 것입니다. 예를 들면 Flow를 사용하여 API에 최신 업데이트를 가져와 Flow 연산자로 수정할 수 있습니다. Flow에 대해 설명하기 전에 Hot/Cold stream에 대해서 짚어보겠습니다. HotStream은 수신자가 없어도 데이터를 전송합니다. 반해 ColdStream은 수신자가 있을 때만 전송합니다. 예를 들어 Channels은 HotStream 입니다. HotStream은 매번 data flow 가 있기 때문에 수신자를 제어해야합니다. 데이터 손실 혹은 메모리 누수를 일으킬 수 있기 때문입니다. 반면 ColdStream은 요청할 때만 수집을 시작합니다. kotlin의 flow는 코틀린의 Corou..
보기 좋은 방법으로 Multiple Coroutine 기다리기 val downloadBooksJob = launch { downloadBooks() } val downloadMoviesJob = launch { downloadMovies() } val downloadSongsJob = launch { downloadSongs() } downloadBooksJob.join() downloadMoviesJob.join() downloadSongsJob.join() // this line will not run until ALL of the downloads complete 위 방식을 이용하는 것 보다 Collection.joinAll 을 이용하는게 더 보기 좋아진다. val downloadJobs = listOf( launch { downloadBooks() }, la..
inline, noinline, crossinline inline 이란? 고차 함수를 사용하면 런타임 패널티가 있기 때문에 함수 구현자체를 코드에 넣음으로써 오버헤드를 없앨 수 있다. >> 고차함수는 객체를 생성하기 때문에 생기는 오버헤드라고 볼 수 있습니다. 인라인은 인스턴스를 만들지 않고 코드를 호출하는 위치에 그대로 복사해서 컴파일되는 바이트코드의 양은 많아지겠지만, 추가적인 객체 생성은 없습니다. inline 함수는 내부적으로 코드를 복사하기 때문에, 인자로 전달 받은 함수는 다른 함수로 전달되거나 참조할 수 없습니다. 그래서 필요한 것이 noinline입니다. noinline 인자 앞에 noinline 키워드를 붙이면 해당 인자는 inline에서 제외됩니다. 따라서 다른 함수의 인자로 전달하는 것이 가능해집니다. crossinline inline ..
코루틴 컨텍스트 전환 초기 Cntinuation은 DispatchedContinuation으로 감싸여 있다. 여전히 Continuation이지만 Unconfined를 제외한 경우에, 필요에 따라 CorotineDispatcher로 전달할 수 있다. DispatchedTask를 전송한다. DispatchedTask는 Runnable로, withCoroutineContext()를 사용하여 적절한 컨텍스트를 설정하고, DispatchedContinuation으로부터 resume()와 resumeWithException() 함수를 호출한다. 따라서 실제 스레드 변경 작업은 CoroutineDispatcher에서 일어나지만, 실행 전에 연속체를 가로챌 수 있는 전체 파이프라인 덕분에 가능한 것이다. 서적 : 코틀린 동시성 프로그래밍
코루틴 디버깅 로그에서 코루틴 식별 디버깅 중에 코루틴을 식별할 필요가 있을 때가 있다. private fun threadName() = Thread.currentThread().name 위 코드를 사용해서 Thread를 식별할 수 있다. 코루틴에 특정 이름 설정 물론 코루틴에 특정 이름을 설정하는 방법도 있다. withContext(pool + CoroutineName("inner") { } 위처럼 CoroutineName을 통해 가능하다. CoroutineNeme은 컨텍스트 요소 이므로 + 연산자로 사용해 설정할 수 있다. 디버거 감시 추가 Debug Tool 창의 [Variables] 부분에 New Watch 버튼과 브레이크 포인트를 통해 스레드의 이름을 감시할 수 있다. Condition : Thread.cur..
코틀린 Contracts 코틀린 Contracts 기능은 코틀린 1.3에서 소개된 기능입니다. 컴파일러를 돕는 역할로 실험적인 기능입니다. Initailizing in Lambdas fun calledOneTimeOnly(run: () -> Unit) { // do something } fun initValue() { val intValue: Int calledOneTimeOnly { // Does not compile: // Captured values initialization is forbidden due to possible reassignment. intValue = 1 } } [https://pspdfkit.com/blog/2018/kotlin-contracts/] 위 코드에 보면 function이 한번만 호출되는 것..
코루틴 콘텍스트 (Context) 디스패처는 코루틴이 실행될 스레드를 결정한다. 시작될 곳과 중단 후 재개될 곳을 모두 포함된다. Dispatcher.Default CommonPool로 프레임워크에 의해 자동으로 생성되는 스레드 풀이다. 스레드 풀의 최대 크기는 시스템의 코어 수에서 1을 뺀 값이다. Dispatcher.Unconfinded 첫 번째 중단 지점에 도달할 때까지 현재 스레드에 있는 코루틴을 실행한다. 코루틴은 일시 중지된 후에, 일시 중단 연산에서 사용된 기존 스레드에서 다시 시작된다. 단일 스레드 컨텍스트 항상 코루틴이 특정 스레드 안에서 실행된다는 것을 보장해주는 것으로 newSingleThreadContext()를 사용한 것을 의미한다. 스레드 풀 newFixedThreadPoolContext()를 의미한 것으로 스레..