Coroutine 동기화 문제 아래의 코드는 100개의 Coroutine을 만들고 각 Coroutine은 coutner를 1씩 증가하는 작업을 1000번 작업한다. 하지만 결과를 확인하면 우리의 예상대로 나오지 않는다. 그 이유는 Coroutine의 Dispatcher는 내부적으로 Thread Pool을 통해 Multi Thread 환경에서 작동한다. 즉 동기화 작업을 처리하지 않았기 때문에 오류가 발행한다. Dispatchers.Default는 JVM에 설정된 만큼 Thread Pool을 갖습니다. 보통 CPU 수와 같으며 최소 2개를 갖습니다. import kotlinx.coroutines.* import kotlin.system.measureTimeMillis suspend fun massiveRu..
Supervision Coroutine에서 Exception이 발생한 경우 Exception이 전파되면서 다른 자식들의 Coroutine을 취소시키고, 부모까지 취소시킨다. 하지만 여러 Coroutine에서 API를 호출하여 UI를 업데이트 하는 작업을 생각해보자. 하나의 API가 실패한 경우 모든 Coroutine이 취소되면서 다른 작업까지 영향을 미친다. 이러한 문제점을 해결하기 위한 방법이 Supervision이다. SupervisionJob 일반적인 Job과 비슷하지만 Exception이 아래 방향으로만 전달된다. 즉 Exception이 발생했을 때 다른 자식들이나 부모의 Coroutine을 취소하지 않고 자신과 자신의 자식들의 Coroutine만 취소한다. SupervisionJob은 매개변수로..
Exception Coroutine에서 기본적으로 Exception 처리 방식은 전달(Propagation)과 노출(Expose)가 있습니다. launch나 actor같은 빌더는 예외가 부모 Coroutine으로 전달되고, async나 produce같은 빌더는 결과 값을 사용할 때 Exception이 노출됩니다. import kotlinx.coroutines.* @OptIn(DelicateCoroutinesApi::class) fun main() = runBlocking { val job = GlobalScope.launch { // root coroutine with launch println("Throwing exception from launch") throw IndexOutOfBoundsExcep..
Job Lifecycle Job의 상태는 기본적으로 New, Active, Completing, Cancelling, Cancelled, Completed 총 6개의 상태를 가집니다. State isActive isCompleted isCancelled New false false false Active true false flase Completing true false false Cancelling false false true Cancelled false true true Completed false true false New : Coroutine을 생성할 때 start를 Lazy로 설정한 경우 New로 시작합니다. start(), join() 등의 함수로 시작할 수 있습니다. Active : 기본..
cancen() & cancelAndJoin() Coroutine에서 취소가 어떻게 진행되는지 확인해봅니다. // cancel과 cancelAndJoin의 차이 public suspend fun Job.cancelAndJoin() { cancel() return join() } cancel()을 실행했을 때 취소되지 않고 Coroutine이 계속 실행됩니다. 즉 Coroutine 내부에서 진행될 때 취소를 확인하여 종료할 수 있도록 설계 해야합니다. (개발자가 직접 취소 지점을 정할 수 있습니다.) val job = CoroutineScope(Dispatchers.IO).launch { for (i in 0 until 5) { Log.d("PASS", "Running") Thread.sleep(1000L..
CoroutineContext CoroutineContext는 Coroutine이 어떠한 환경(Thread)에서 실행될지 결정하는 중요한 매개체입니다. CoroutineScope를 만들거나 CoroutineBuilder로 새로운 Coroutine을 만들 때 주로 쓰입니다. 즉 Coroutine Context를 통해 어떠한 Thread로 Dispatch될지 결정합니다. Thread Pool 직접 Thread Pool을 만들고 해당 Thread Pool에서 작동하는 Dispatcher를 만들 수 있습니다. (Dispatcher는 CoroutineContext를 상속받습니다.) val dispatcher = newFixedThreadPoolContext(10, "New Fixed Thread") Corouti..
Scope CoroutineBuilder(launch, async)를 생성하는 범위이다. CoroutineBuilder를 통해 만들어진 Coroutine들은 기본적으로 해당 Scope의 Context를 전달받는다. 즉 Scope는 Coroutine을 만들 수 있는 범위이며, cancel같은 함수로 해당 Scope의 Coroutine을 관리할 수 있다. val scope = CoroutineScope(Dispatchers.IO) val job = scope.launch { // 기본적으로 스코프의 Context 영향을 받는다. (IO) launch { // 상위 스코프의 Context를 가져온다. (IO) } launch(Dispatchers.Main) { // Context를 재정의 할 수 있다. (Ma..
Coroutine Coroutine은 동기/비동기를 효율적으로 프로그래밍하기 위한 하나의 동시성 프로그래밍 설계 개념입니다. Kotlin뿐만 아니라 다른 언어에도 존재하는 개념이고 오래된 개념입니다. Android에서 Coroutined은 비동기적으로 실행되는 코드를 간결하게 작성할 수 있고, Thread보다 성능이 좋으며, Jetpack에서 많은 기능을 지원하는 장점이 있습니다. Thread vs Coroutine Thread는 고유한 Stack가 할당되며 동시성을 보장하기 위해 OS가 스케쥴링을 하여 적합한 Thread를 실행하고 Context Switching으로 인한 오버헤드가 발생하고 중지된 Thread는 OS의 선택을 받기 위해 기다립니다(Blocking한다고 표현함). Coroutine은 L..
- Total
- Today
- Yesterday
- ViewModelStoreOwner
- clean code
- observable
- DART
- git
- Exception
- CancellationException
- ConcatAdapter
- 클린코드
- ViewModelProvider
- Android
- 클린 코드
- rxjava
- viewmodel
- ConcatAdapter.Config
- null
- DSL
- Kotlin
- 코루틴
- 보이스카우트 규칙
- gradle
- Widget
- commit
- Coroutine
- 연산자
- 함수
- Flowable
- TDD
- Flutter
- isActive
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |