관리 메뉴

나만을 위한 블로그

[Android] Coroutine의 Job과 Dispatchers란? 본문

Android

[Android] Coroutine의 Job과 Dispatchers란?

참깨빵위에참깨빵 2023. 1. 31. 02:33
728x90
반응형

코루틴을 시작할 때 코루틴의 취소 등 제어를 위해 CoroutineContext를 지정한다. CoroutineContext란 Job, CoroutineDispatcher 등이 모여있는 집합으로 코루틴이 실행되는 환경이다.

코루틴으로 비동기 작업을 실행할 때 기본적인 사용법은 아래와 같다.

 

val coroutine = CoroutineScope(Dispatchers.IO).launch { 
    // ...
}

 

위 코드에서 CoroutineScope() 안에 넣어준 매개변수가 CoroutineContext다. Dispatchers를 넣었지만 Job도 넣어서 사용할 수 있다.

 

val job = Job()
val coroutine = CoroutineScope(job + Dispatchers.IO).launch {
    // ...
}
val coroutine2 = CoroutineScope(Dispatchers.IO).launch { 
    // ...
}
job.cancel()

 

Job과 Dispatchers은 각각 아래와 같다.

 

https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/

 

Job

Job common A background job. Conceptually, a job is a cancellable thing with a life-cycle that culminates in its completion. Jobs can be arranged into parent-child hierarchies where cancellation of a parent leads to immediate cancellation of all its childr

kotlinlang.org

배경 작업. 개념적으로 작업은 완료로 끝나는 생명주기가 있는 취소 가능한 것이다. 작업을 부모-자식 계층 구조로 정렬할 수 있다. 부모를 취소하면 모든 자식이 재귀적으로 즉시 취소된다. 이 동작은 SupervisorJob을 써서 커스텀할 수 있다
Job 인터페이스의 가장 기본적인 인스턴스는 다음과 같이 생성된다

- Coroutine Job : launch 코루틴 빌더 실행으로 생성된다. 지정된 코드 블록을 실행하고 이 블록이 완료되면 완료 처리된다
- CompletableJob : Job() 팩토리 함수로 생성된다. CompletableJob.complete를 호출하면 완료된다

개념적으로 Job 실행은 결과값을 생성하지 않는다. Job은 부작용을 위해서만 시작된다. Job은 아래와 같은 상태를 갖는다

 

https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/

 

CoroutineDispatcher

CoroutineDispatcher common Base class to be extended by all coroutine dispatcher implementations. The following standard implementations are provided by kotlinx.coroutines as properties on the Dispatchers object: Dispatchers.Default — is used by all stan

kotlinlang.org

모든 코루틴 디스패처 구현으로 확장되는 기본 클래스

- Dispatchers.Default : Dispatcher나 다른 ContinuationInterceptor가 컨텍스트에 지정되지 않은 경우 launch, async 같은 모든 표준 빌더에서 사용되는 기본 CoroutineDispatcher다. JVM의 공유 쓰레드 풀에서 지원된다
- Dispatchers.IO : 요청 시 생성된 쓰레드의 공유 풀을 사용하고 파일 입출력, 소켓 입출력 같은 입출력 집중 차단 작업의 오프로드를 위해 설계됐다
- Dispatchers.Unconfined : 특정 쓰레드에 국한되지 않는 코루틴 디스패처. 현재 호출 프레임에서 코루틴의 초기 연속을 실행하고 특정 쓰레딩 정책을 요구하지 않으며 해당 일시중단 함수에서 사용하는 모든 쓰레드에서 코루틴을 재개할 수 있다. 코루틴 빌더 함수가 반환되는 첫 번째 중단까지 현재 호출 프레임에서 코루틴 실행을 시작한다. 일반적으로 사용하면 안 된다

 

안드로이드 디벨로퍼의 경우 Unconfined 디스패처를 아예 적어두지 않았다. Dispatchers 뒤에 온점을 찍으면 자동완성 리스트에 표시되기는 한다.

https://developer.android.com/kotlin/coroutines/coroutines-adv?hl=ko#main-safety
 

Kotlin 코루틴으로 앱 성능 향상  |  Android 개발자  |  Android Developers

Kotlin 코루틴으로 앱 성능 향상 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Kotlin 코루틴을 사용하면 네트워크 호출이나 디스크 작업과 같은 장기 실행 작

developer.android.com

- Dispatchers.Main : 메인 쓰레드에서 코루틴을 실행한다. 이 Dispatcher는 UI와 상호작용하고 빠른 작업을 실행하기 위해서만 써야 한다. suspend 함수를 호출하거나 UI 작업 실행, LiveData 업데이트 시 사용한다
- Dispatchers.IO : 메인 쓰레드 밖에서 디스크 or 네트워크 입출력을 실행하도록 최적화되어 있다. Room DB를 사용하고 파일 입출력, 네트워크 작업을 실행한다
- Dispatchers.Default : CPU를 많이 사용하는 작업을 메인 쓰레드 밖에서 실행하도록 최적화되어 있다. 리스트 정렬, JSON 파싱 등을 수행한다

 

둘의 차이를 정리하면 아래와 같다.

 

  • Job : 코루틴을 식별, 정렬하고 제어하는 용도로 사용
  • Dispatchers : 코루틴을 어떤 쓰레드에서 실행시킬 건지 정하는 용도로 사용

 

만약 코루틴을 만들었는데 Dispatchers를 지정하지 않았다면 위에 적었듯 Dispatchers.Default가 적용된다.

이것과 관련한 스택오버플로우 답변이 있는데 참고하면 좋을 것 같아 링크를 걸어둔다.

 

https://stackoverflow.com/questions/69853525/how-important-is-it-to-specify-dispatchers-context-in-kotlin-coroutines-what-ha

 

How important is it to specify dispatchers/context in Kotlin coroutines? What happens if you don't specify them?

If a coroutine was launched and no dispatcher was specified (eg. GlobalScope.launch {}), what dispatcher is used? If that coroutine was launched in the main thread, would it use Dispatchers.main? A...

stackoverflow.com

 

반응형
Comments