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..
Coroutine Builder CoroutineScope의 확장함수로 Coroutine을 만드는 역할을 합니다. CoroutineScope(Dispatchers.IO).launch { // do something coroutine } launch() 가장 기본적인 Builder입니다. launch()는 Thread를 Blocking하지 않으며Job이라는 객체를 반환합니다. Job은 cancel(), join() 등 의 함수를 가지고 있습니다. launch의 2번때 매개변수로 CoroutineStart가 주어집니다. CoroutineStart으로 시작 방식을 지정할 수 있습니다. fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutine..
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..
- Total
- Today
- Yesterday
- DART
- isActive
- gradle
- clean code
- git
- 보이스카우트 규칙
- Flowable
- observable
- 함수
- Kotlin
- ViewModelStoreOwner
- Android
- Coroutine
- Exception
- ConcatAdapter
- 코루틴
- Flutter
- commit
- 클린코드
- Widget
- 연산자
- viewmodel
- TDD
- ViewModelProvider
- CancellationException
- DSL
- null
- rxjava
- ConcatAdapter.Config
- 클린 코드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |